Sql Data Readerクローズ問題:リーダーがオフになったらReadの起動を試みます.



最近ADO.NETを勉強しましたが、Sql DataReaderをパッケージ化して他のところで呼び出します.
しかし、いくつかの問題に出会って、最後に解決方法を見つけました.パッケージ化時にusing{}で接続や実行などを含めると、最後の接続を閉じることができます.
しかし、呼び出し時にエラーが発生します.
最初にカプセル化したコードはこうです.
 
public static SqlDataReader GetDataReader(string sql, params SqlParameter[] parameters)
    {
        using (SqlConnection conn = new SqlConnection(connstr))
        {
            SqlCommand cmd = new SqlCommand(sql, conn);
            foreach (SqlParameter parameter in parameters)
            {
                cmd.Parameters.Add(parameter);
            }

            try
            {
                conn.Open();
                SqlDataReader dr = cmd.ExecuteReader();
                return dr;
            }
            catch (Exception e)
            {
                throw new Exception("      :" + e.Message + "   "+ sql);
            }
        }
    }
 
このような方法で実装すると、GetData Readerメソッドを呼び出してエラーを報告します.これはusing{}の作用領域が出た後、接続が自動的にオフになり、ReaderはDataSetと違って、DataSetはすでにデータをローカルメモリに保存していますが、Readerはデータをローカルメモリに保存していません.データだけを指していると理解できます.接続がオフになったら、readerでデータを読み取ります.もちろん実現できません.そこで、多くの資料を参考にして、コードを修正しました.そして、ネット上のいくつかの言い方が違っている問題を検証しました.
修正後のコードは以下の通りです.
protected void TextBoxName_TextChanged(object sender, EventArgs e)
    {
        string UserN = TextBoxName.Text;
        string strsql = "select * from UserInfo where UI01=@UserName";

        SqlDataReader dr = DBN.GetDataReader(strsql, new SqlParameter("UserName", UserN));
        if (dr.Read())
        {
            Response.Write("alert('       ');");
            TextBoxName.Text = null;
        }
        dr.Close();//   close      。
         Response.Write(dr.IsClosed.ToString() + "
");// SqlDataReader }
このようにパッケージした後、私は一つのホームページのバックグラウンドコードから呼び出しました.
protected void TextBoxName_TextChanged(object sender, EventArgs e)
    {
        string UserN = TextBoxName.Text;
        string strsql = "select * from UserInfo where UI01=@UserName";

        SqlDataReader dr = DBN.GetDataReader(strsql, new SqlParameter("UserName", UserN));
        if (dr.Read())
        {
            Response.Write("alert('       ');");
            TextBoxName.Text = null;
        }
        dr.Close();//   close      。
         Response.Write(dr.IsClosed.ToString() + "
");// SqlDataReader }
 
このようにエラーはありません.「リーダーが閉じた時にReadを呼び出してみたら無効です.」ここで説明したいのは、データの読み取りが完了した後、Sql DataReaderが不要になった場合、手動で閉じる必要があります.cmd.ExecuteReaderはSql Data Readerをオフにしてから自動的に接続をオフにすることができますが、Sql DataReaderは手動でオフにしなければなりません.上のコードの中でdr.Close.Write(dr. IsCloed.Tostring)をオフにすると、Relseは指定されていません.MSDNにも記述されている:Sql Data Readerを使用する場合、関連するSql ConnectionはSql Data Readerサービスに忙しく、Sql Connectionに対して他の操作は一切実行できず、シャットダウンするしかない.Sql DataReaderのCloseメソッドを起動しない限り、この状態になります.このことから、ネット上ではSql DataReaderを手動で閉じなくてもいいという人がいます.