可能性のある複製:
ストアドプロシージャからデータテーブルにテーブルを取得する方法
データテーブルを作成しようとしています。データテーブル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"));
列を手動で追加する必要はありません。 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が呼び出される前に接続が開いている場合、開いたままになります。
代わりに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);
}
}
}
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);
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には探している情報が含まれます。