C# 当读卡器关闭时调用HasRows的尝试无效
我有这个问题:当读卡器关闭时调用HasRows的尝试无效。 我试了很多;卸下连接闭合线,最后闭合连接。但是有同样的问题。我不知道我的代码有什么问题C# 当读卡器关闭时调用HasRows的尝试无效,c#,sql,C#,Sql,我有这个问题:当读卡器关闭时调用HasRows的尝试无效。 我试了很多;卸下连接闭合线,最后闭合连接。但是有同样的问题。我不知道我的代码有什么问题 try { con = new SqlConnection(ConfigurationManager.ConnectionStrings["TextItConnectionString"].ConnectionString); using (con) { con.Open(); Library.
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
。您知道这将消耗resultset的所有记录并将读取器推进到下一个集合吗?我这样问是因为在您已经使用了DataTable.Load之后,您正在使用HasRows
作为
查看参考源,您可以清楚地看到
在退出该方法之前,请查看DataReader
是否已关闭
因此,如果没有其他结果集(例如,SELECT*FROM T1;SELECT*FROM T2
),读卡器将在Load
结束时关闭,这将导致在尝试使用SqlDataReader.HasRows
时出现异常
我称之为缺乏文档,因为上面没有提到它
所以要么使用
reader.Read
和reader.GetString
在循环中,并手动将其添加到数据表中
使用DataTable。加载并在之后或之后循环该表
使用SqlDataAdapter.Fill(表格)
:
1) 同时
循环并手动填充表格
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.Load中,另一个在foreach中
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");
}
旁注:如果使用using
-语句,则不需要使用reader.Close
或con.Close
。能否显示user.dt.Load()方法?我假设user.dt
返回一个数据表。您知道DataTable.Load(reader)
将使用结果集的所有记录A,并将读取器推进到下一个集合吗?我这样问是因为在您已经使用了DataTable.Load
之后,您正在使用HasRows
。旁注:如果使用using
-statement,则不需要使用reader.Close
或con.Close
。查看的参考源,您可以清楚地看到DataReader在退出该方法之前已关闭。@ArtavazdBalayan user是我的类,dt是DataTable,load是其内置函数,用于在DataTable中加载数据Thank you@Tim it works。现在我知道我错在哪里了。是的,这是一个愚蠢的错误(缺少文档)。谢谢你帮助我。@MuhammadTauseen:不客气。注意,我使用SqlDataAdapter.Fill
添加了第三种方法。那么你根本不需要读者。请注意,如果使用SqlDataAdapter.Fill
,您甚至不需要打开/关闭连接,因为这是自动完成的(但这样做也没有坏处)。哦,太好了。再次感谢。我有另一个问题。上面的代码是我的windows服务。我想将数据从windows服务加载到网页。将数据加载到DataTable dt后,我从Default.aspx.cs文件调用函数,以加载Default.aspx.cs文件GridView1.DataSource=dt中的gridview;GridView1.DataBind()代码>错误:对象引用未设置为对象的实例。@MuhammadTauseen:我不理解windows服务和web应用程序之间的关系。您不能也不需要从windows服务访问web应用。反之亦然。windows服务可用于更新数据库和web应用程序,以便从数据库中读取并显示结果。那么两者之间就有了间接的联系。在一个大项目上工作。其数据每分钟更新一次。因此,我正在创建一个windows服务,它将在每分钟后运行,并更新网页上的GridView
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");
}