【问题标题】:Calling a stored procedure results in an incorrectly empty DataTable调用存储过程会导致错误地为空的 DataTable
【发布时间】:2015-11-03 17:40:48
【问题描述】:

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

【问题讨论】:

  • 您无需致电Update 来填写DataSet。这仅用于通过对 DataSet 的相关更改来更新数据库。
  • 你有什么异常吗?
  • 没有例外
  • 这不是使用参数的方式。
  • 您需要参数化您的代码,而不是构建一个字符串并执行它。你所拥有的很容易受到 sql 注入的攻击。

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


【解决方案1】:

很抱歉迟到了但是我只是想确认一件事。

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

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

嗯,太好了 - 我自己也发现了这一点。 DataTable 将包含 0 行和 0 列,但使用它来填充 DataSet,它工作正常。

所以这里真正的问题是:为什么它不能与 DataTable 一起使用,而它却可以与 DataSet 一起使用?

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

那么,@user9993,如果你还在的话,能不能告诉我....你的 SP 做的不仅仅是 SELECT 吗?即使只是临时表或表变量之类的东西,它也会更新或删除吗?

【讨论】:

  • 这是一个答案,还是一个后续问题?请注意此网站doesn't work like a discussion forum。这是一个问答网站,每个帖子要么是一个问题,要么是一个问题的答案。如果是后续问题,您应该删除它并提出新问题here。如果答案您可能会edit 来澄清您的解决方案,这似乎是填写DataSet 而不是填写DataTable
  • 两者兼而有之。这是一个后续问题,但基于预感,如果我的预感被证明是正确的,那么它可能是对 OP 和我自己的类似问题的实际答案。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-13
    • 1970-01-01
    • 2023-03-20
    • 2019-02-13
    • 1970-01-01
    • 2011-05-02
    • 2016-10-12
    • 1970-01-01
    相关资源
    最近更新 更多