web-dev-qa-db-ja.com

ストアドプロシージャからDataTableを作成する方法

可能性のある複製:
ストアドプロシージャからデータテーブルにテーブルを取得する方法

データテーブルを作成しようとしています。データテーブルtmpABCDを作成しましたが、これにストアドプロシージャの値を入力する必要があります。これ以上先に進むことはできません。

SqlConnection sqlcon = new SqlConnection(ConfigurationManager.ConnectionStrings["DB"].ConnectionString);
sqlcon.Open();
SqlCommand cmd = new SqlCommand("usp_GetABCD", sqlcon);

DataTable dt = new DataTable("tmpABCD");

dt.Columns.Add(new DataColumn("A"));
dt.Columns.Add(new DataColumn("B"));
dt.Columns.Add(new DataColumn("C"));
dt.Columns.Add(new DataColumn("D"));
18
Rash

列を手動で追加する必要はありません。 DataAdapterを使用するだけで、次のように簡単になります。

DataTable table = new DataTable();
using(var con = new SqlConnection(ConfigurationManager.ConnectionStrings["DB"].ConnectionString))
using(var cmd = new SqlCommand("usp_GetABCD", con))
using(var da = new SqlDataAdapter(cmd))
{
   cmd.CommandType = CommandType.StoredProcedure;
   da.Fill(table);
}

接続を開いたり閉じたりする必要もないことに注意してください。それは DataAdapter によって暗黙的に行われます。

SELECTステートメントに関連付けられた接続オブジェクトは有効である必要がありますが、開いている必要はありません。 Fillが呼び出される前に接続が閉じられた場合、データを取得するために開かれ、閉じられます。 Fillが呼び出される前に接続が開いている場合、開いたままになります。

49
Tim Schmelter

代わりにSqlDataAdapterを使用します。はるかに簡単で、列名を自分で定義する必要はありません。クエリ結果から列名を取得します。

using (SqlConnection sqlcon = new SqlConnection(ConfigurationManager.ConnectionStrings["DB"].ConnectionString))
{
    using (SqlCommand cmd = new SqlCommand("usp_GetABCD", sqlcon))
    {
        cmd.CommandType = CommandType.StoredProcedure;

        using (SqlDataAdapter da = new SqlDataAdapter(cmd))
        {
            DataTable dt = new DataTable();

            da.Fill(dt);
        }
    }
}
13
Sean Airey

SqlDataAdapterを使用できます:

    SqlDataAdapter adapter = new SqlDataAdapter();
    SqlCommand cmd = new SqlCommand("usp_GetABCD", sqlcon);
    cmd.CommandType = CommandType.StoredProcedure;
    adapter.SelectCommand = cmd;
    DataTable dt = new DataTable();
    adapter.Fill(dt);
2
BFree

SqlDataAdapterを使用すると、すべてが簡単になります。

//Your code to this point
DataTable dt = new DataTable();

using(var cmd = new SqlCommand("usp_GetABCD", sqlcon))
{
  using(var da = new SqlDataAdapter(cmd))
  {
      da.Fill(dt):
  }
}

保存されたプロシージャがデータセット(カーソル)を返す限り、DataTableには探している情報が含まれます。

2
iMortalitySX