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();解决了这个问题,即使我也面临着同样的问题。
谢谢!
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();解决了这个问题,即使我也面临着同样的问题。 谢谢!