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

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

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

データベースからのデータの取得方法について

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

■87203 / inTopicNo.1)  データベースからのデータの取得方法について
  
□投稿者/ 夜叉丸 (95回)-(2018/04/26(Thu) 11:09:49)

分類:[.NET 全般] 

環境は VisualStudio2017 C# .Net です。

データベースからのデータを現在は以下で取得しています。
------------------------------------------------------------------------
private static DataTable GetDatatable(string connectionstring, string CommandText)
{
 var table = new DataTable();
 dtError = null;

 connectionstring += "; connect timeout=60";
 using (var connection = new SqlConnection(connectionstring))
 {
  using(var command = connection.CreateCommand())
  {
   try
   {
    	connection.Open();
    	command.CommandText = CommandText;
    var adapter = new SqlDataAdapter(command);
    adapter.Fill(table);
   }
   catch(Exception e)
   {
    GetErrorDatatable(connectionstring, CommandText);
    throw new Exception(e.Message);
   }
   finally
   {
    connection.Close();
   }
  }
 }
 return table;
}
------------------------------------------------------------------------

やりたいことは
マネージメントスタジオのように複数のデータを取得したいのです。
簡単に例を示すと、CommandTextを以下のようにして
----------
select *
from A

select *
from B
----------

DataTable dta;
DataTable dtb;
として取得したいのですがどうすればよいのでしょうか?

最終的には一時テーブルを作成し、そこからそれぞれを取得したいので、
分割して処理をすると、毎回一時テーブルを作成することになるので
一度に取れる方法があれば教えてください。

よろしくお願いします。



引用返信 編集キー/
■87204 / inTopicNo.2)  Re[1]: データベースからのデータの取得方法について
□投稿者/ WebSurfer (1474回)-(2018/04/26(Thu) 11:44:59)
No87203 (夜叉丸 さん) に返信

> データベースからのデータを現在は以下で取得しています。

そのメソッドは期待通り動いている(接続文字列と SELECT クエリの文字列を引数として渡せば、
指定した BD のテーブルから DataTable をせ生して戻り値として返す)のでしょうか?

> 簡単に例を示すと、CommandTextを以下のようにして
> ・・・中略・・・
> 一度に取れる方法があれば教えてください。

「一度に」というのがどういうことか引っ掛かりますが、GetDatatable メソッドが期待通り動いて
いるのであれば、以下のようにすればよさそうです。

DataTable dta = GetDatatable("接続文字列", "select * form A");
DataTable dtb = GetDatatable("接続文字列", "select * from B");

GetDatatable メソッド を使う以上は、上記以外には方法はなさそうです。
引用返信 編集キー/
■87205 / inTopicNo.3)  Re[1]: データベースからのデータの取得方法について
□投稿者/ WebSurfer (1475回)-(2018/04/26(Thu) 12:00:20)
No87203 (夜叉丸 さん) に返信

【追記】

以下は本題とは関係ない話ですが、知っておいたお方がよさそうだと思うので、追記します。

(1) SqlDataAdapter.Fill メソッドは Open / Close を自動でやってくれますので、特に理由
  (他とトランザクションに束ねるとか)がなければ、そのコードを書く必要はないです。

(2) throw new Exception(e.Message); はダメです。スタックトレースが途切れるので。
  単に throw; とすべきです。

例外処理について、詳しくは以下の記事を見てください。

NETの例外処理 Part.1
https://blogs.msdn.microsoft.com/nakama/2008/12/29/net-part-1/

.NETの例外処理 Part.2
https://blogs.msdn.microsoft.com/nakama/2009/01/02/net-part-2/

.NET 4 からは破損状態例外は catch できなくなっているそうですが、「それでも Catch
(Exception e) を使用するのはよくない」ということについては以下の記事を見てください。

破損状態例外を処理する
https://msdn.microsoft.com/ja-jp/magazine/dd419661.aspx

引用返信 編集キー/
■87206 / inTopicNo.4)  Re[2]: データベースからのデータの取得方法について
□投稿者/ 夜叉丸 (96回)-(2018/04/26(Thu) 12:24:05)
No87204 (WebSurfer さん) に返信

一度にというのは
CommandText に

select * from A
select * from B

を記述し、結果として DataTable[] とかで
取得できるように GetDatatable を変更したいのです。
引用返信 編集キー/
■87207 / inTopicNo.5)  Re[3]: データベースからのデータの取得方法について
□投稿者/ WebSurfer (1476回)-(2018/04/26(Thu) 12:41:41)
No87206 (夜叉丸 さん) に返信

> 一度にというのは
> CommandText に
>
> select * from A
> select * from B
>
> を記述し、結果として DataTable[] とかで
> 取得できるように GetDatatable を変更したいのです。

可能とは思いますが、自分的には全くメリットを感じません。なので、すみませんが、この話からは撤退させてください。
引用返信 編集キー/
■87208 / inTopicNo.6)  Re[3]: データベースからのデータの取得方法について
□投稿者/ やよい (1回)-(2018/04/26(Thu) 12:59:42)
No87206 (夜叉丸 さん) に返信

CommandTextを可変長引数で渡して

↓これをCommandTextの数繰り返して

var table = new DataTable();
var adapter = new SqlDataAdapter(command);
adapter.Fill(table);

リストに詰めてToArray()で配列を返せばOK
引用返信 編集キー/
■87209 / inTopicNo.7)  Re[3]: データベースからのデータの取得方法について
□投稿者/ せば (1回)-(2018/04/26(Thu) 13:25:56)
> 一度にというのは
> CommandText に
> 
> select * from A
> select * from B

using (var connection = new SqlConnection(connectionstring))
{
    using (var command = connection.CreateCommand())
    {
        try
        {
            DataSet ds = new DataSet();
            StringBuilder sb = new StringBuilder();
            sb.AppendLine("select 1;");
            sb.AppendLine("select 2;");

            connection.Open();
            command.CommandText = sb.ToString();
            var adapter = new SqlDataAdapter(command);
            adapter.Fill(ds);

            foreach (DataTable dt in ds.Tables)
            {
                Console.WriteLine(dt.Rows[0][0]);
            }

        }
        catch (Exception)
        {
            throw;
        }
    }
}

とか?

引用返信 編集キー/
■87210 / inTopicNo.8)  Re[4]: データベースからのデータの取得方法について
□投稿者/ 夜叉丸 (97回)-(2018/04/26(Thu) 13:26:27)
2018/04/26(Thu) 13:27:21 編集(投稿者)

説明不足でどうもすみません。
処理結果を得る時間がかかるSQL文で基本となる一つのテーブルを作成します。
これを#Bとした場合にこの処理が5分かかった場合に

--------------------
CREATE TABLE #B
〜〜〜

SELECT *
FROM #B
WHERE a=1
--------------------
CREATE TABLE #B
〜〜〜

SELECT *
FORM #B
WHERE a=2
--------------------
として2回呼ぶと単純に10分かかることになります。

--------------------
CREATE TABLE #B
〜〜〜

SELECT *
FROM #B
WHERE a=1

SELECT *
FORM #B
WHERE a=2
--------------------

1つのテキストとして送信し、同時に2つの結果を得る方法があれば
5分+αの時間で習得することができるとおもって質問させていただきました。



引用返信 編集キー/
■87211 / inTopicNo.9)  Re[3]: データベースからのデータの取得方法について
□投稿者/ PANG2 (5回)-(2018/04/26(Thu) 13:39:26)
2018/04/26(Thu) 14:02:57 編集(投稿者)
2018/04/26(Thu) 13:57:51 編集(投稿者)

private static DataSet GetDataSet(string connectionstring, string CommandText)
{
var ds = new DataSet();
new SqlDataAdapter(connectionstring, CommandText).Fill(ds);
return ds;
}

結果セットが複数ある場合は、DataSet.Tables で複数テーブルを返します。

引用返信 編集キー/
■87212 / inTopicNo.10)  Re[4]: データベースからのデータの取得方法について
□投稿者/ 夜叉丸 (98回)-(2018/04/26(Thu) 14:32:38)
2018/04/26(Thu) 14:46:00 編集(投稿者)

No87211 (PANG2 さん) に返信

ありがとうございました。
一度に複数のテーブル結果を取得することができました。
解決済み
引用返信 編集キー/

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


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

このトピックに書きこむ