【问题标题】:ExecuteReader returns no results, when inspected query doesExecuteReader 不返回任何结果,当检查查询确实
【发布时间】:2024-01-03 04:39:01
【问题描述】:

考虑以下代码:

        StringBuilder textResults = new StringBuilder();
        using(SqlConnection connection = new SqlConnection(GetEntityConnectionString()))
        {
            connection.Open();
            m.Connection = connection;
            SqlDataReader results = m.ExecuteReader();
            while (results.Read())
            {
                textResults.Append(String.Format("{0}", results[0]));
            }
        }

我在数据库的 Sql Server Mgmt Studio 中使用了活动监视器来检查正在发送的确切查询。然后,我将该查询文本复制到 SSMS 中的查询编辑器窗口,查询返回了预期的结果。但是SqlDataReader results始终为空,表示“枚举没有返回结果”。

我的怀疑是结果没有正确返回,这让我认为上面的代码有问题,而不是查询本身被传递。

在上面的代码中有什么会导致这种情况的吗?还是我忽略了什么?

编辑:

这是 SQLCommand 对象所指示的查询:

SELECT DISTINCT StandardId,Number 
FROM vStandardsAndRequirements 
WHERE StandardId IN ('@param1','@param2','@param3') 
ORDER BY StandardId

这是活动监视器中显示的查询:

SELECT DISTINCT StandardId,Number 
FROM vStandardsAndRequirements 
WHERE StandardId IN ('ABC-001-0','ABC-001-0.1','ABC-001-0') 
ORDER BY StandardId

查询针对的是单个视图。

当我对数据库运行第二个查询时,它返回了 3 行。

SqlDataReader 指示 0 行。

【问题讨论】:

  • 也许您应该向我们展示查询和表的外观,很难判断没有查询/DDL 的情况。上面的代码没问题。

标签: sql ado.net


【解决方案1】:

你确定是吗

WHERE StandardId IN ('@param1','@param2','@param3') 

而不是这个?

WHERE StandardId IN (@param1,@param2,@param3) 

参数不应被引用,不在 SQLCommand 对象中。

【讨论】:

  • 我试过了,得到了 1 行。但是,我应该得到三行。所以我认为这可能是问题的一部分,但不是全部......
  • @morgan 为什么你认为你应该得到 3 行?如果 StandardId 是唯一的,我认为最多 2 行,因为 WHERE StandardId IN ('ABC-001-0','ABC-001-0.1','ABC-001-0') param1 和 param3 是相同的。
  • @morgan - textResults 还将所有结果附加在一起,没有任何逗号、管道或其他分隔符。你得到的只是一个字符串,所以很难看出是否有多个结果。
  • 哎呀——这是最后一个参数的错字,应该是 ABC-001-0a。至于 textResults,我实际上是在检查 SqlDataReader 的输出中的行数,这就是为什么我没有注意到这一点。谢谢!
【解决方案2】:

尝试使用 Sqldata 适配器而不是 sqldatreader。

StringBuilder textResults = new StringBuilder();

        using (var conn = new SqlConnection(GetEntityConnectionString())))
        {
            using (
                var cmd = new SqlCommand(
            "SELECT DISTINCT StandardId,Number" +
                "FROM vStandardsAndRequirements " +
            "WHERE StandardId IN (@param1,@param2,@param3)" +
            "ORDER BY StandardIdl"

       , conn))
            {

                var dSet = new DataSet();
                var dt = new Datatable();

                var da = new SqlDataAdapter(cmd);

                cmd.Parameters.Add("@param1", SqlDbType.VarChar, 50).Value = "ABC-001-0";
        cmd.Parameters.Add("@param2", SqlDbType.VarChar, 50).Value = "ABC-001-0.1";
                cmd.Parameters.Add("@param3", SqlDbType.VarChar, 50).Value = "ABC-001-0";
                try
                {

                    da.Fill(dSet);

        dt = dSet.Tables[0];

        foreach(Datarow a in dt.Rows)
        {

            textResults.Append(a["StandardId"].tostring()).AppendLine();


        }

        Messabox.Show(textResults.tostring);

                }
                catch (SqlException)
                {
                    throw;
                }

       finally
                {
                    if (conn.State == ConnectionState.Open) conn.Close();
                }

            }
        }

问候。

【讨论】:

    【解决方案3】:

    检查您的连接字符串并确保您不是作为用户实例进行连接。

    http://msdn.microsoft.com/en-us/library/ms254504.aspx

    【讨论】:

    • 已检查 - 连接字符串中没有“用户实例”,而且我没有使用 Sql Server Express - 这与完整的 SQL Server 实例背道而驰。
    【解决方案4】:

    我观察到的非常好的行为

    我在代码中查找错误:

     ... dr = command.ExecuteReader()  ... If dr.Read Then ...
    

    发现 'dr.Read' 工作正常,但是... 当我将鼠标悬停在“博士”上时,查找数据时,返回值消失了!

    【讨论】: