gpt4 book ai didi

c# - 阅读器关闭时调用 HasRows 的尝试无效

转载 作者:太空宇宙 更新时间:2023-11-03 23:14:42 24 4
gpt4 key购买 nike

我有这个问题:阅读器关闭时调用 HasRows 的尝试无效。我已经尝试了很多;删除连接关闭线,最后关闭连接。但有同样的问题。我看不出我的代码有什么问题。

try
{
con = new SqlConnection(ConfigurationManager.ConnectionStrings["TextItConnectionString"].ConnectionString);
using (con)
{
con.Open();
Library.writeErrorLog("connection build and open");
SqlCommand cmd = con.CreateCommand();
using (cmd)
{
cmd.CommandText = "Select [name] From [dbo].[Users]";
SqlDataReader reader = cmd.ExecuteReader();
using (reader)
{
user.dt.Load(reader);
if (reader.HasRows)
{
while (reader.Read())
{
Library.writeErrorLog(reader.GetString(0));
}
}
else
Library.writeErrorLog("no rows");
reader.Close();
con.Close();
}
}
}
//SqlDataAdapter adap = new SqlDataAdapter("Select [name] From [dbo].[Users]", con);
//adap.Fill(user.dt);
}
catch (Exception ex)
{
Library.writeErrorLog(ex);
}

感谢您的帮助!

最佳答案

我假设 user.dt 返回一个 DataTable。你知道 DataTable.Load(reader)将消耗结果集的所有记录并将读者推进到下一组?我问是因为您正在使用 HasRows after 您已经使用了 DataTable.Load

作为Steve has commented

Looking at the reference source of DataTable.Load you could clearly see that the DataReader is closed before exiting from the method.

因此,如果没有其他结果集(例如 SELECT * FROM T1;SELECT* from T2),读取器将在 Load 结束时关闭,这将导致如果您尝试使用 SqlDataReader.HasRows,则会出现异常。

我将其称为缺乏文档,因为它在MSDN 上没有被提及。 .

所以要么使用

  1. reader.Readreader.GetString 循环并手动添加到DataTable
  2. 使用 DataTable.Load 然后循环表格或
  3. 使用 SqlDataAdapter.Fill(table):

1) while 循环并手动填充表格

using (SqlDataReader reader = cmd.ExecuteReader())
{
if(reader.HasRows)
{
while (reader.Read())
{
string name = reader.GetString(0);
user.dt.Rows.Add(name);
Library.writeErrorLog(name);
}
}
else
Library.writeErrorLog("no rows");
}

2) 需要两个循环,一个在DataTable.Loadforeach

using (SqlDataReader reader = cmd.ExecuteReader())
{
if(reader.HasRows)
{
user.dt.Load(reader); // all records added
foreach(DataRow row in user.dt.Rows)
{
string name = row.Field<string>(0);
Library.writeErrorLog(name);
}
}
else
Library.writeErrorLog("no rows");
}

3) 另一种选择是使用 SqlDataAdapter 和它的 Fill(dataTable) 方法:

using (var da = new SqlDataAdapter(cmd))
{
da.Fill(user.dt);
if (user.dt.Rows.Count > 0)
{
foreach (DataRow row in user.dt.Rows)
{
string name = row.Field<string>(0);
Library.writeErrorLog(name);
}
}
else
Library.writeErrorLog("no rows");
}

旁注:如果使用 using 语句,则无需使用 reader.Closecon.Close

关于c# - 阅读器关闭时调用 HasRows 的尝试无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37656737/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com