DBReader有行但Read()返回false

时间:2016-07-01 11:19:59

标签: c# sql .net sql-server dbconnection

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.Read正在返回false所以我的处理代码没有被调用。

这似乎是非常基本的“从数据库表中读取行”的东西,所以我错过了什么?我应该直接查看读者的行数据吗?

3 个答案:

答案 0 :(得分:5)

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

请参阅调试器窗口中的注释:

  

结果视图:展开结果视图将枚举IEnumerable

因此,您的调试器已经读出了所有结果,如果您步入reader.Read(),则无法读取更多行,Read()会返回false

我只是用一个小小的测试来复制它。当我的调试器读取结果时,我的代码无法再读取它们。如果我不让调试器显示它们,我的代码可以读取它们。 (QED)

答案 1 :(得分:-1)

您可以尝试SELECT 1;来测试您的读者。 你有SqlManagement Studio吗?测试查询。

这是工作。

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

答案 2 :(得分:-4)

将读者类型var更改为SqlDataReader reader = command.ExecuteReader();并尝试此操作。它会有效。

我有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;
                        }
                    }
            }
        }