调用存储过程会导致错误的空DataTable

本文关键字:DataTable 错误 存储过程 调用 | 更新日期: 2023-09-27 18:07:22

我有一个正常运行的存储过程,它在手动执行时返回正确的数据。输出中有几行数据。但是,下面的代码总是导致没有数据行被添加到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的工作方式有错误的理解。我应该如何修复代码?

调用存储过程会导致错误的空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,它工作得很好。

所以真正的问题是:为什么它与数据集一起工作,而不是与数据表一起工作?

我有一个怀疑,我真的在这里试图证明它是对还是错。在我的例子中,我发现只要SP包含DELETE或INSERT之类的操作,SP就开始返回这个奇怪的空DataTable。在我的例子中,最初的SP只是对一些数据进行简单的SELECT,我必须增加一些复杂性,这意味着我必须首先使用insert填充一个Table Variable,然后从中进行SELECT。就在那时,我遇到了这个问题。

所以,@user9993,如果你还在,你可以告诉我....你的SP做的不仅仅是SELECT吗?它是否做更新或删除,即使它只是对临时表或表变量?