SPを呼び出すクエリを実行すると、そのSPはデータを返します...しかし、DataAdapterを使用して呼び出すと、結果データが得られません。代わりにDataReaderを使用すると、データが得られます。データベースはSQLServerであり、変更できない理由でコードはOleDbを使用しています。
これらの2つの呼び出しは、異なるものを返します。
String commandText = "Declare @return_value int; exec dbo.copyTemplate ? , ? , ? , ? , ? , ? , ?, Null , 0 , @return_value;";
Console.WriteLine("Data Adapter");
using (OleDbConnection con = new OleDbConnection(connectionString))
{
using (OleDbDataAdapter da = new OleDbDataAdapter(commandText, con))
using (DataTable table = new DataTable("table"))
{
da.SelectCommand.Parameters.AddWithValue("?",9).DbType = DbType.Int32;
da.SelectCommand.Parameters.AddWithValue("?", "AAAAB").DbType = DbType.String;
da.SelectCommand.Parameters.AddWithValue("?", 1).DbType = DbType.Int32;
da.SelectCommand.Parameters.AddWithValue("?", 1).DbType = DbType.Int32;
da.SelectCommand.Parameters.AddWithValue("?", 2).DbType = DbType.Int32;
da.SelectCommand.Parameters.AddWithValue("?", true).DbType = DbType.Boolean;
da.SelectCommand.Parameters.AddWithValue("?", DateTime.Now.Date).DbType = DbType.DateTime;
da.Fill(table);
foreach (DataRow dr in table.Rows)
{
foreach (DataColumn dc in table.Columns)
{
Console.Write(dr[dc].ToString());
Console.Write(" ");
}
Console.WriteLine();
}
}
}
Console.WriteLine("Data Reader");
using (OleDbConnection con = new OleDbConnection(connectionString))
{
using (OleDbCommand cmd = new OleDbCommand(commandText, con))
{
cmd.Parameters.AddWithValue("?", 9).DbType = DbType.Int32;
cmd.Parameters.AddWithValue("?", "AAAAC").DbType = DbType.String;
cmd.Parameters.AddWithValue("?", 1).DbType = DbType.Int32;
cmd.Parameters.AddWithValue("?", 1).DbType = DbType.Int32;
cmd.Parameters.AddWithValue("?", 2).DbType = DbType.Int32;
cmd.Parameters.AddWithValue("?", true).DbType = DbType.Boolean;
cmd.Parameters.AddWithValue("?", DateTime.Now.Date).DbType = DbType.DateTime;
con.Open();
using (OleDbDataReader reader = cmd.ExecuteReader())
while (reader.Read())
{
for (int i = 0; i < reader.FieldCount; i++)
{
Console.Write(reader.GetValue(i) ?? "null");
Console.Write(" ");
}
Console.WriteLine();
}
}
}
Console.ReadKey(true);
このコードは次を返します:
Data Adapter
Data Reader
1057
このコードは何百回も呼び出すことができ、DataReaderでは常にDataAdapterで何も取得しません。また、2番目のパラメーターには何でも含めることができ、SPの結果は何も変更されません。2つの呼び出し間でパラメーター値を交換したり、順序を変更したりできます...結果は同じです:(
なぜこれが起こっているのか分かりません。
何が問題になるのか、誰か考えがありますか?
乾杯。
更新:DataTableの代わりにDataSetに入力すると、次の結果が得られます。
Console.WriteLine("Data Adapter with DataSet");
using (OleDbConnection con = new OleDbConnection(connectionString))
{
using (OleDbDataAdapter da = new OleDbDataAdapter(commandText, con))
using (DataSet ds = new DataSet("table"))
{
da.SelectCommand.Parameters.AddWithValue("?",9).DbType = DbType.Int32;
da.SelectCommand.Parameters.AddWithValue("?", "AAAAB").DbType = DbType.String;
da.SelectCommand.Parameters.AddWithValue("?", 1).DbType = DbType.Int32;
da.SelectCommand.Parameters.AddWithValue("?", 1).DbType = DbType.Int32;
da.SelectCommand.Parameters.AddWithValue("?", 2).DbType = DbType.Int32;
da.SelectCommand.Parameters.AddWithValue("?", true).DbType = DbType.Boolean;
da.SelectCommand.Parameters.AddWithValue("?", DateTime.Now.Date).DbType = DbType.DateTime;
da.Fill(ds);
foreach (DataTable table in ds.Tables)
foreach (DataRow dr in table.Rows)
{
foreach (DataColumn dc in table.Columns)
{
Console.Write(dr[dc].ToString());
Console.Write(" ");
}
Console.WriteLine();
}
}
}
ただし、DataSetにはテーブルが1つしかないため、DataAdapter.Fill(DataTable)が機能しない理由がわかりません。