调用存储过程导致错误地为空 DataTable
Calling a stored procedure results in an incorrectly empty DataTable
我有一个正常运行的存储过程,它 returns 手动执行时的正确数据。输出中有几行数据。但是,我的以下代码总是导致没有数据行被添加到 DataTable。
var commandString = string.Format(@"EXEC MyStoredProcedure {0}", SomeParameter);
var dataTable = new DataTable();
using (var connection = new SqlConnection(ConnectionString))
{
connection.Open();
using (var adapter = new SqlDataAdapter(commandString, ConnectionString))
{
using (new SqlCommandBuilder(adapter))
{
adapter.Fill(dataTable);
adapter.Update(dataTable);
}
}
}
var result = (from DataRow row in dataTable.Rows
select new MyModelClass
{
SomeString = (string) row["SomeString"],
SomeValue = (string) row["SomeValue"],
}).ToList();
Debug.WriteLine("Results: " + result.Count);
我不确定代码为什么没有数据行。我哪里错了?我怀疑这是因为我对 DataTable
的工作原理有错误的理解。我应该如何修复代码?
基本上,您的代码应如下所示:
string ConnectionString = "<Your connection string here>";
string procedureName = "<your stored procedure name here>";
string ParamName = "@<Parameter name>"; // NOTE: the '@' is INSIDE the string!
DataSet ds = new DataSet();
using (var connection = new SqlConnection(ConnectionString))
{
var cmd = new SqlCommand(procedureName, connection);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add(ParamName, SqlDbType.Int).Value = 5;
using (var adapter = new SqlDataAdapter(cmd))
{
adapter.Fill(ds);
}
}
很抱歉迟到了但是我只是想确认一件事。
我注意到在 OP 中提问者使用适配器来填充 DataTable
然而,在接受的答案中,适配器用于填充 DataSet
嗯,太好了 - 我自己也发现了这一点。 DataTable 将包含 0 行和 0 列,但用它来填充 DataSet,并且工作正常。
所以这里的真正的问题是:为什么它与 DataSet 一起工作而不与 DataTable 一起工作?
我有一个怀疑,我真的来这里是为了证明它是对还是错。就我而言,我发现一旦我的 SP 包含 DELETE 或 INSERT 之类的内容,SP 就开始返回这个奇怪的空数据 Table。在我的例子中,原始 SP 只是来自一些数据的简单 SELECT,我必须添加一些复杂性,这意味着我首先必须使用 INSERT 填充一个 Table 变量,然后 [=32= 】 从那。那是我 运行 遇到这个问题的时候。
所以,@user9993,如果你还在身边,你能告诉我....你的 SP 做的不仅仅是 SELECT 吗?它是否会更新或删除,即使它只是针对临时 Table 或 Table 变量之类的东西?
我有一个正常运行的存储过程,它 returns 手动执行时的正确数据。输出中有几行数据。但是,我的以下代码总是导致没有数据行被添加到 DataTable。
var commandString = string.Format(@"EXEC MyStoredProcedure {0}", SomeParameter);
var dataTable = new DataTable();
using (var connection = new SqlConnection(ConnectionString))
{
connection.Open();
using (var adapter = new SqlDataAdapter(commandString, ConnectionString))
{
using (new SqlCommandBuilder(adapter))
{
adapter.Fill(dataTable);
adapter.Update(dataTable);
}
}
}
var result = (from DataRow row in dataTable.Rows
select new MyModelClass
{
SomeString = (string) row["SomeString"],
SomeValue = (string) row["SomeValue"],
}).ToList();
Debug.WriteLine("Results: " + result.Count);
我不确定代码为什么没有数据行。我哪里错了?我怀疑这是因为我对 DataTable
的工作原理有错误的理解。我应该如何修复代码?
基本上,您的代码应如下所示:
string ConnectionString = "<Your connection string here>";
string procedureName = "<your stored procedure name here>";
string ParamName = "@<Parameter name>"; // NOTE: the '@' is INSIDE the string!
DataSet ds = new DataSet();
using (var connection = new SqlConnection(ConnectionString))
{
var cmd = new SqlCommand(procedureName, connection);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add(ParamName, SqlDbType.Int).Value = 5;
using (var adapter = new SqlDataAdapter(cmd))
{
adapter.Fill(ds);
}
}
很抱歉迟到了但是我只是想确认一件事。
我注意到在 OP 中提问者使用适配器来填充 DataTable
然而,在接受的答案中,适配器用于填充 DataSet
嗯,太好了 - 我自己也发现了这一点。 DataTable 将包含 0 行和 0 列,但用它来填充 DataSet,并且工作正常。
所以这里的真正的问题是:为什么它与 DataSet 一起工作而不与 DataTable 一起工作?
我有一个怀疑,我真的来这里是为了证明它是对还是错。就我而言,我发现一旦我的 SP 包含 DELETE 或 INSERT 之类的内容,SP 就开始返回这个奇怪的空数据 Table。在我的例子中,原始 SP 只是来自一些数据的简单 SELECT,我必须添加一些复杂性,这意味着我首先必须使用 INSERT 填充一个 Table 变量,然后 [=32= 】 从那。那是我 运行 遇到这个问题的时候。
所以,@user9993,如果你还在身边,你能告诉我....你的 SP 做的不仅仅是 SELECT 吗?它是否会更新或删除,即使它只是针对临时 Table 或 Table 变量之类的东西?