调用存储过程会导致DataTable不正确

时间:2015-08-11 13:10:28

标签: c# sql sql-server datatable ado.net

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

2 个答案:

答案 0 :(得分:1)

基本上,您的代码应该如下所示:

 
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);
    }
}

答案 1 :(得分:0)

很抱歉聚会晚了但是,我只想确认一些事情。

我注意到,在OP中,请求者使用适配器来填充 DataTable

但是,在接受的答案中,适配器用于填充 DataSet

嗯,太好了-我也是自己发现这个的。 DataTable将包含0行和0列,但可以使用它来填充DataSet,并且可以正常工作。

因此,这里的 real 问题是:为什么不与DataTable一起使用时为何与DataSet一起使用?

我有一个怀疑,我真的是在这里尝试证明它是对还是错。以我为例,我发现SP一旦包含诸如DELETE或INSERT之类的内容,SP就开始返回这个奇怪的空DataTable。在我的情况下,原始SP只是从某些数据中进行的简单SELECT,因此我不得不增加一些复杂性,这意味着我必须首先使用INSERT填充表变量,然后从中进行SELECT。那就是我遇到这个问题的时候。

@ user9993,如果您仍然在身边,您可以告诉我....您的SP不仅可以执行SELECT吗?它只是对临时表或表变量进行更新还是删除?