teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

追記

2019/08/13 01:19

投稿

退会済みユーザー
answer CHANGED
@@ -70,4 +70,19 @@
70
70
 
71
71
  > ③ それ以外に、同時にアクセスする方法があるようでしたら教えてください。
72
72
 
73
- については上の手段を検討してはいかがでしょう?
73
+ については上の手段を検討してはいかがでしょう?
74
+
75
+ **【追記2】**
76
+
77
+ 以下の記事に書いてあるように SqlDataReader を使って、それを Close しなくても複数の SELECT クエリの結果セットを取得することもできます。サンプルコードの reader.NextResult(); に注目してください。
78
+
79
+ 接続文字列でのデータベース名の指定
80
+ [http://surferonwww.info/BlogEngine/post/2014/05/30/initial-catalog-keyword-in-sqlclient-connection-string.aspx](http://surferonwww.info/BlogEngine/post/2014/05/30/initial-catalog-keyword-in-sqlclient-connection-string.aspx)
81
+
82
+ 自分は SQL Server の場合しか確認してませんが、興味がありましたら質問者さんの方で MySqlDataReader でも同じことができるかどうか確認してみてください。
83
+
84
+ 上の【追記】で書いた MySqlDataAdapter.Fill (DataSet) メソッドで複数のクエリから複数の DataTable を取得する場合もそれを使っているはずなので、MySQL でも SQL Server と同じことができるのではないかと思います。
85
+
86
+ 【追記】の方法【追記2】の方法ともラウンドトリップが 1 回で済むので、複数のクエリを投げて複数のラウンドトリップとならざるを得ない質問者さんの原案よりは早そうです。
87
+
88
+ 後は、ホントに DataSet / DataTable を作る必要があるかどうかで、【追記】の方法にするか【追記2】の方法にするか選んではいかがですか?

1

追記

2019/08/13 01:19

投稿

退会済みユーザー
answer CHANGED
@@ -35,4 +35,39 @@
35
35
 
36
36
  の「直列」と同じ(むしろ、スレッドの切り替えの分オーバーヘッドが増えて逆に遅くなる)と思うのですが。
37
37
 
38
- アプリ側で何とかする手段があるとしても、リモートの DB サバ―へ tcp 接続しているとすると、そこは「直列」とならざるを得ませんけど?
38
+ アプリ側で何とかする手段があるとしても、リモートの DB サバ―へ tcp 接続しているとすると、そこは「直列」とならざるを得ませんけど?
39
+
40
+ **【追記】**
41
+
42
+ 一つ思い出したことがあるので追記します。
43
+
44
+ Microsoft のドキュメントの「DbDataAdapter.Fill メソッド (DataSet)」の説明に以下の記述があります。
45
+
46
+ "指定したクエリが複数の結果を返す場合は、クエリを返す各列の結果セットが個別のテーブルに格納されます。2 番目以降の結果セットには、指定されたテーブル名に整数値を追加した名前が付けられます。たとえば、Table、Table1、Table2 のようになります。"
47
+
48
+ これは MySQL の Connector/NET の MySqlDataAdapter.Fill (DataSet) メソッドでも同じようです。
49
+
50
+ 検証してみましたが、以下のコードのように複数の SELECT クエリ(以下の例では 3 つ)をセットすれば、DataSet に 3 つの DataTable を自動的に生成してくれます。
51
+
52
+ ```
53
+ string connString = "接続文字列";
54
+ string queryString = "SELECT * FROM city; SELECT * FROM country; SELECT * FROM countrylanguage";
55
+ DataSet dataset = new DataSet();
56
+
57
+ using (MySqlConnection connection = new MySqlConnection(connString))
58
+ {
59
+ MySqlDataAdapter adapter = new MySqlDataAdapter();
60
+ adapter.SelectCommand = new MySqlCommand(queryString, connection);
61
+ adapter.Fill(dataset);
62
+ }
63
+ ```
64
+
65
+ city, country, countrylanguage は MySQL のサンプルデータベース world に含まれるものです。確認のため DataGridView に表示して見ましたが、以下の画像の通りちゃんと取得できているようです。
66
+
67
+ ![イメージ説明](99d07562cf3e778214a630694ee0a039.jpeg)
68
+
69
+ という訳で、質問の、
70
+
71
+ > ③ それ以外に、同時にアクセスする方法があるようでしたら教えてください。
72
+
73
+ については上の手段を検討してはいかがでしょう?