DBReader 有行但 Read() returns false

DBReader has rows but Read() returns false

using (var conn = new SqlConnection(connectionString))
{
    var cmd = new SqlCommand("SELECT * FROM mySchema.MyTable", conn);
    conn.Open();
    var reader = cmd.ExecuteReader();
    while(reader.Read())
    {...

在调试器中我可以看到我的 reader 有一行 - 我可以看到返回的数据 - 但是 reader.Read 正在返回 false 所以我的处理代码没有被调用。

这似乎是非常基本的 "read rows from a database table" 内容,所以我缺少什么?我应该直接查看 reader 的行数据还是什么?

将 reader 类型 var 更改为 SqlDataReader reader = command.ExecuteReader(); 并尝试 this.It 会起作用。

我有 MYSQL

的示例代码
using (MYSQLCON)
        {
            using (MySqlDataReader sdr = sqlcmd.ExecuteReader())
            using (YourWriter)
            {
                String Header = null;
                String Content = null;

                for (int i = 0; i <= sdr.FieldCount - 1; i++)
                {
                    Header = Header + sdr.GetName(i).ToString() + ",";
                }
                YourWriter.WriteLine(Header);
                while (sdr.Read())

                    for (int i = 0; i <= sdr.FieldCount - 1; i++)
                    {
                        Content = Content + sdr[i].ToString() + ",";
                        if (i == sdr.FieldCount - 1)
                        {
                            YourWriter.WriteLine(Content);
                            Content = null;
                        }
                    }
            }
        }

你可以试试SELECT 1;来考验你reader。 你有 SQL 管理工作室吗?测试查询。

这是工作。

 using (var conn = new SqlConnection(connectionString))
        {
            var cmd = new SqlCommand("select 1", conn);
            conn.Open();
            var reader = cmd.ExecuteReader();
            while(reader.Read())
            {
                string a = "teste";
            }
        }

如果让调试器显示结果,它会读出 reader 并枚举结果。

查看调试器中的注释window:

Results View: Expanding the Results View will enumerate the IEnumerable

因此您的调试器已经读出所有结果,如果您进入 reader.Read(),则没有更多行可读,并且 Read() returns false.


我只是用小测试重现了它。当我的调试器读取结果时,我的代码无法再读取它们。如果我不让调试器显示它们,我的代码就可以读取它们。 (qed)

这可能对某人有帮助。就我而言,我忘记使用

 cmd.CommandType = System.Data.CommandType.StoredProcedure

因此,reader.HasRows() 或 reader.Read() 返回 false。

将 reader 类型变量更改为 SqlDataReader reader = command.ExecuteReader();解决了这个问题,即使我也面临着同样的问题。 谢谢!