首页 > 解决方案 > 阅读器关闭时调用 Read 的尝试无效。你可以帮助我

问题描述

我不知道是什么问题,您可以帮我找到解决方案并解决问题,Decrypt() 是解密代码的方法

var test = Decrypt(cli);
DataTable dt = new DataTable();
conn.Open();
SqlDataReader myReader = null;
SqlCommand id_c = new SqlCommand("Select * From ResearcherInformation where Email='" + test + "'", conn);
myReader = id_c.ExecuteReader();
while (myReader.Read())
    {
        var idid = myReader["Id_Researcher"].ToString();
        conn.Close();
        ScriptManager.RegisterStartupScript(this, GetType(), "showalert", "alert('access');", true);
    }
    myReader.Close();
    conn.Close();

标签: c#

解决方案


您正在关闭循环中间的连接:

while (myReader.Read())
{
    var idid = myReader["Id_Researcher"].ToString();
    conn.Close();
    ScriptManager.RegisterStartupScript(this, GetType(), "showalert", "alert('access');", true);
}

这就是为什么一旦您第二次遍历阅读器,连接就会关闭。不要这样做:

while (myReader.Read())
{
    var idid = myReader["Id_Researcher"].ToString();
    ScriptManager.RegisterStartupScript(this, GetType(), "showalert", "alert('access');", true);
}

使用后关闭连接,而不是使用时关闭。


还有一些值得注意的事情:

  1. 您依赖于可注入 SQL 的做法。这既是一个主要的安全漏洞,也是一个非常常见的错误来源。使用查询参数将值视为而不是可执行代码。这是开始示例的好地方:https ://docs.microsoft.com/en-us/dotnet/framework/data/adonet/ado-net-code-examples Google 搜索“C# 参数化查询”会发现更多的。
  2. 看看using你的SqlConnection对象和其他实现IDisposable.
  3. 您不会将idid变量用于任何事情,因此您可以摆脱它。你也从不使用dt,所以你也可以摆脱它。

推荐阅读