C# 当读卡器关闭时调用HasRows的尝试无效

C# 当读卡器关闭时调用HasRows的尝试无效,c#,sql,C#,Sql,我有这个问题:当读卡器关闭时调用HasRows的尝试无效。 我试了很多;卸下连接闭合线,最后闭合连接。但是有同样的问题。我不知道我的代码有什么问题 try { con = new SqlConnection(ConfigurationManager.ConnectionStrings["TextItConnectionString"].ConnectionString); using (con) { con.Open(); Library.

我有这个问题:当读卡器关闭时调用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
。您知道这将消耗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");
    }