C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

同時に取得する方法

[トピック内 10 記事 (1 - 10 表示)]  << 0 >>

■97623 / inTopicNo.1)  同時に取得する方法
  
□投稿者/ 白音 (3回)-(2021/06/15(Tue) 16:57:23)

分類:[データベース全般] 

VisualStudio からデータソースを介して
SQLServer に以下の6つを同時にとってくることは
できるのでしょうか?
SQLServerManagementStudio では同時に書いて実行すると
同時に返ってきます。

Getを使ってもFillを使っても以下の6つを
同時取得する方法がわかりません。


SELECT	*
FROM	TBLA
WHERE	CODE = @OBCODE

SELECT	*
FROM	TBLA
WHERE	CODE = @NPCODE

SELECT	*
FROM	TBLB
WHERE	PCODE = @NPCODE

SELECT	*
FROM	TBLA
WHERE	CODE = @NCCODE

SELECT	*
FROM	TBLC
WHERE	CODE = @NCCODE

SELECT	*
FROM	TBLB
WHERE	PCODE = @NPCODE
	OR CCODE = @NCCODE

引用返信 編集キー/
■97624 / inTopicNo.2)  Re[1]: 同時に取得する方法
□投稿者/ 魔界の仮面弁士 (3132回)-(2021/06/15(Tue) 17:17:20)
No97623 (白音 さん) に返信
> VisualStudio からデータソースを介して
> SQLServer に以下の6つを同時にとってくることは
> できるのでしょうか?

バッチクエリというやつですね。

ADO.NET の SqlDataAdapter なら .Fill メソッドに DataSet を渡せば、
DataSet 内の別々の DataTable に保持されます。
https://www.atmarkit.co.jp/fdotnet/dotnettips/137multisel/multisel.html

SqlDataReader 経由で取得している場合は、そのリーダーの
NextResult (または NextResultAsync) メソッドを呼び出せば、
次の結果セットが読み込まれます。

Dapper なら、QueryMultiple メソッドを使えます。
https://github.com/DapperLib/Dapper
引用返信 編集キー/
■97625 / inTopicNo.3)  Re[2]: 同時に取得する方法
□投稿者/ 白音 (4回)-(2021/06/16(Wed) 09:07:00)
2021/06/16(Wed) 09:19:23 編集(投稿者)

No97624 (魔界の仮面弁士 さん) に返信
ありがとうございます。

データソースにTABLEを追加して TABLE.xsd を作成し、表示すると
それぞれのテーブルの箱があり、
それぞれのTBL?(TBLA, TBLB, TBLC, TBLD・・・)の列が表示されていて、
その下に TBL?TableAdapter が表示されています。

TBLA の TableAdapter に追加クエリで
FillAll(@OBCODE, @NPCODE, @NCCODE)
を作成してC#からの呼び出し元を以下のような関数にしています。


static adpt = new dsTABLETableAdapters.TBLATableAdapter();

public static DataSet FillAll(string OLDBCODE, string NEWZCODE, string NEWBCODE)
{
 dsTABLE ds = new dsSIMS2_MASTER();
 ds.EnforceConstraints = false;
 adpt.FillAll(ds.TBLA, OLDBCODE, NEWZCODE, NEWBCODE);
 return (ds.TBLA);
}

として使用したのですが、最初の1つ目の結果しか返ってきませんでした。。

呼び出しを
adpt.FillAll(ds, OLDBCODE, NEWZCODE, NEWBCODE);
に変えてみたのですが、ds は引数として受け付けませんでした。
何がいけないのでしょうか?

引用返信 編集キー/
■97626 / inTopicNo.4)  Re[3]: 同時に取得する方法
□投稿者/ WebSurfer (2267回)-(2021/06/16(Wed) 09:34:40)
No97625 (白音 さん) に返信

> データソースにTABLEを追加して TABLE.xsd を作成し、表示すると
> それぞれのテーブルの箱があり、
> それぞれのTBL?(TBLA, TBLB, TBLC, TBLD・・・)の列が表示されていて、
> その下に TBL?TableAdapter が表示されています。

Visual Studio のデータソース構成ウィザードを使って型付 DataSet / DataTable + TableAdapter を
作成したようですね。であれば、そういう話は最初の質問の一行目に書いてください。そうしないと話
が噛み合わなくて、質問者さん、閲覧者、回答者の時間と労力の無駄になります。

それを作った後、以下の記事の「D. テーブルアダプタへのクエリ追加」セクションにあるようにして、
WHERE 句で条件付き抽出ができるようにしてますか?

7.6 データコンポーネント機能によるデータアクセスコンポーネントの開発
https://www.atmarkit.co.jp/fdotnet/bookpreview/vs2005webapp_07/vs2005webapp_07_03.html

上の記事の例では、FillByState, GetDataByStata(@state) がそれです。



引用返信 編集キー/
■97627 / inTopicNo.5)  Re[4]: 同時に取得する方法
□投稿者/ 還暦 (10回)-(2021/06/16(Wed) 10:34:04)
2021/06/16(Wed) 10:45:37 編集(投稿者)

6つ作ってそれぞれを作って呼び出すしかないのでは?

SELECT *
FROM TBLA
WHERE CODE = @OBCODE

SELECT *
FROM TBLA
WHERE CODE = @NPCODE

SELECT *
FROM TBLB
WHERE PCODE = @NPCODE

SELECT *
FROM TBLA
WHERE CODE = @NCCODE

SELECT *
FROM TBLC
WHERE CODE = @NCCODE

SELECT *
FROM TBLB
WHERE PCODE = @NPCODE
OR CCODE = @NCCODE
引用返信 編集キー/
■97630 / inTopicNo.6)  Re[3]: 同時に取得する方法
□投稿者/ 魔界の仮面弁士 (3133回)-(2021/06/16(Wed) 14:05:05)
No97625 (白音 さん) に返信
> その下に TBL?TableAdapter が表示されています。

TableAdapter の場合は、複数の DataTable の取得が行えません。
DataAdapter を No97624 のリンク先のように呼び出してください。

もしくは、バッチクエリにせず、SQL を分けて、個別に Fill するようにします。
引用返信 編集キー/
■97671 / inTopicNo.7)  Re[4]: 同時に取得する方法
□投稿者/ 白音 (5回)-(2021/06/24(Thu) 16:19:20)
No97630 (魔界の仮面弁士 さん) に返信

ありがとうございました。
複数のデータをとることができました。

そこで。。。なのですが

ウィザードを使用して以下のスカラー形式でデータを
とってくる方法を使っていますが、
今回と同様に以下の文字列を送信して
dataをとってくる方法ってあるのでしょうか?

string data;
da.Fill(data);
はダメでした。


SELECT DATA
FROM TBLA
WHERE CODE = @OBCODE

やはり、以下のように一度 DataTable dt で取得して
data を取得するのでしょうか?

string connstr = Properties.Settings.Default.ConnectionString;
SqlDataAdapter da = new SqlDataAdapter(
"SELECT DATA" +
"FROM TBLA" +
"WHERE CODE = @OBCODE", connstr);
DataSet ds = new DataSet();
ds.EnforceConstraints = false;
DataTable dt = new DataTable();
ds.Tables.Add(dt);
da.Fill(dt);

string data = (dt.Rows.Count <= 0) ? "": dt.Rows[0]["DATA"].ToString();
引用返信 編集キー/
■97673 / inTopicNo.8)  Re[5]: 同時に取得する方法
□投稿者/ 魔界の仮面弁士 (3141回)-(2021/06/24(Thu) 18:17:37)
No97671 (白音 さん) に返信
> 今回と同様に以下の文字列を送信して
> dataをとってくる方法ってあるのでしょうか?

スカラー値の場合には、DataTable を経由させるのではなく、
DataReader を使って取得します。
https://docs.microsoft.com/ja-jp/dotnet/framework/data/adonet/retrieving-data-using-a-datareader


あるいは「Dapper」を使うのもお手軽で良いかと思います。
https://dapper-tutorial.net/execute-scalar
https://webbibouroku.com/Blog/Article/dapper
引用返信 編集キー/
■97677 / inTopicNo.9)  Re[6]: 同時に取得する方法
□投稿者/ 白音 (6回)-(2021/06/25(Fri) 16:05:44)
No97673 (魔界の仮面弁士 さん) に返信

これでいいのでしょうか?

  private static object Scalar(string selectStr)
  {
   object obj = null;
   string connstr = Properties.Settings.Default.ConnectionString;
   using (var connection = new SqlConnection(connstr))
   {
    using (SqlCommand command = new SqlCommand(selectStr, connection))
    {
     obj = command.ExecuteScalar();     
    }
    connection.Close();
   }
   return (obj);
  }
引用返信 編集キー/
■97680 / inTopicNo.10)  Re[7]: 同時に取得する方法
□投稿者/ 魔界の仮面弁士 (3143回)-(2021/06/25(Fri) 19:30:13)
No97677 (白音 さん) に返信
> これでいいのでしょうか?

はい、それでよいと思います。

もし、object 型だとキャストが面倒だというのであれば、
代わりに dynamic 型で受けてみるのも良いかと思います。

最初から型を明示して受け取りたい場合は、先に紹介した Dapper を使うのが便利です。
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ