Sql Data Readerクローズ問題:リーダーがオフになったらReadの起動を試みます.
3038 ワード
最近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を手動で閉じなくてもいいという人がいます.