2012-04-17 13 views
1

私は接続とSqlReaderを作成したが、それらの両方を閉じるのを忘れ:忘れられた接続を閉じるにはどうすればいいですか?

SqlConnection conn = new SqlConnection("connection info"); 
conn.Open(); 

string sql = "SQL command HERE"; 
SqlCommand cmd = new SqlCommand(sql, conn); 
SqlDataReader reader = cmd.ExecuteReader(); 

今すぐトライを再度コードを実行するとき、それはいつも私にこのエラーを与える:

System.InvalidOperationException: There is already an open DataReader associated with this Command which must be closed first. 

このlinkは私に言いました接続を正しく開いたり閉じたりする方法を説明していますが、まだ実行中のものを閉じる方法について何も説明していません。

私はPCをシャットダウンしようとしましたが、SQLサーバ上のデータベースのオプションを探しましたが(有益なものは見つかりませんでした)...コードを変更して、接続と読者の両方を閉じるだけでしたコードを変更しても問題は残りました)。

「ゴースト」接続を閉じるにはどうすればよいですか?すべての実行中の接続を閉じるための方法(無理矢理)はありますか?


[EDIT:]私は本当にこの問題を解決することができませんでした。この問題を回避するには、

+0

今後の参考のためにあなたが利用するべき多くの人が書いているように、using()ステートメントしかし、ブロッキングの問題を回避するには、運用環境にない場合はMSSQLSERVERインスタンスを再起動してみてください。 – Jim

答えて

1

すべての回答を見ると、問題を回避する方法が示されているようです。

私が間違っていないのであれば、クライアント(お使いのPC)とサーバー(SQLサーバー)の両方に接続が存在するということは、接続を忘れてしまったことですそこに永遠に。

サーバーへの接続を電話会話と考えてください。私はあなたにハングアップすることができますが、接続が失われていることを携帯電話で認識するまでに数秒かかります。私が電話を切ったり、話しを止めたりしたら、あなたはそこに座るかもしれません。あなたは本当に知らない。これは、接続が適切に閉じられていないときにサーバー上で起こることです。 (旧式の固定電話では、電話機をオフフックにして無期限に接続することができます)。

コードで接続を閉じると、自分で接続を終了する前に接続の終了を閉じるようサーバーに指示します。接続を閉じるのを忘れると、プログラムが終了したとき、または再起動したときに終了時に閉じられますが、サーバーは開いている状態でそこに座っています。 (彼がちょうど私の上に電話を切ったのだろうかと疑問に思ってそこに座っている人のことを考えてください)

私が間違っていないなら、SQL Serverの最後でそれを閉じることになります。 (彼らは「ハングアップ」するために取得しています。)

を再起動した後、それはで絶対にはあなたの側で閉じました。それはサーバー上でそれ自身でクリアする必要があります。

あなたはそれを自分で行いたい場合は、あなたがこの情報を使用してコード最後にサーバーでそれをクリアすることができます:How do you kill all current connections to a SQL Server 2005 database?

はるかに容易なアプローチを説明しただけではSQL Server Management Studioでそれを行うことであろうここに:http://www.mikebevers.be/blog/2009/07/kill-open-sql-processes-connections/

+0

これはまさに私の問題でした。私の問題を解決するために必要なものでした!どうもありがとうございます! SQL Server 2008を使用している人は、[リンク](http://social.msdn.microsoft.com/Forums/en-US/sqldatabaseengine/thread/5cb020b5-44fb-465c-9efb-b789763f947e/)をチェックして「活動モニタ "オプション(彼らは場所を変更)。 – dialex

3

ラップusing statementで作成、接続文字列にMultipleActiveResultSets=trueを追加することでした - これは常に接続が閉じられますようになります:私はあなたがゴーストオブジェクトにアクセスすることができるとは思わない

using(SqlConnection conn = new SqlConnection("connection info")) 
{ 
    // your code 
} 
+0

はい私は私のOPにリンクを追加したことがわかりました。しかし、私の問題は、将来の呼び出しでのみ動作し、実行中の接続を閉じることはありません。 – dialex

+1

@DiAlex - あなたはそれが何を意味するのかよく分かりません。アプリケーションが存在するとすぐに、接続は終了します。あなたが見ているエラーは、あなたがそれを再使用する前に接続を閉じていないという事実のためです。 – Oded

+0

いいですね。しかし、私は、アプリケーションを実行するたびに新しい接続が作成されるので、私は新しいものを使用しているので、「再利用の問題」は存在しないはずです。 Btw usingステートメント、接続またはSqlDataReaderの内部にあるべきものThx – dialex

4

あなたが「近い」または接続の「処分」しても言われる

using(SqlConnection conn = new SqlConnection("connection info")) 
{ 
    conn.Open(); 

    string sql = "SQL command HERE"; 
    SqlCommand cmd = new SqlCommand(sql, con); 
    SqlDataReader reader = cmd.ExecuteReader(); 
.... 
} 
+0

もう一度、前の接続を閉じるまで、新しい接続を「正しい方法」で作成することはできません。 – dialex

+0

'conn'がグローバル変数の場合は、[ConnectionState](http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.state.aspx)のプロパティを参照することができます接続がまだ開いているかどうかを確認してください。 – Tigran

+0

@DiAlex - アプリケーションを再コンパイルして再デプロイするとき、どのようにオープンな接続をしていますか? – Oded

1

これらの答えはすべて、問題を回避する方法を教えてくださいすることができますが、彼らは、問題が何であるかを説明していません。

SqlDataReaderはの転送専用のデータアクセスを提供します。つまり、一度使用して終了すると、新しいデータを作成する必要があります。詳細な説明はSee this blogです。基本的に、DataReaderを終了していなければ、そのコネクションとコマンド専用のオープン状態のままになります。

他の人も述べているように、あなたのすべてのリソースを確実に閉じるために最善の方法です。

using (SqlConnection connection = new SqlConnection("...")) { 
    connection.Open(); 

    string sql = "SQL command HERE"; 

    using (SqlCommand cmd = new SqlCommand(sql, con)) 
    using (SqlDataReader reader = cmd.ExecuteReader()) { 
      // do your stuff 
    } 
} 
+0

複数のusingステートメントを記述する+1。私のOPでそれを言及したが、リンクのためのThx:P – dialex

+0

ああ、それを見ていない。このモニターでは、投稿のリンクは通常のテキストとほぼ同じです。 ;)とにかくこれがあなたを助けてくれることを願っています。あなたが問題を抱える主な理由は、ADO.NETフレームワーク(.NETの一部とDataReaderの一部)と、グローバル変数(他のコメント/回答/あなたの返信から聞こえるもの)それはあなたがそれを再利用できなかった理由であるリソースへの参照を保持していました。 –

+0

Btw私はあなたのコードを使用し、David Strattonが述べたように "Activity Monitor"をチェックしましたが、接続は実行終了時に閉じられていません。同じ接続を使用する2つのメソッドを順番に呼び出すと、同じエラーが発生します.2回呼び出すと、同じメソッドがすべてうまく行きます。 – dialex

0

私はこれが古い投稿であることを知っており、これは誰にも役立つかもしれません。しかし、私はこの質問で間違っていたことを投稿する機会を見た。

最初に、connという名前のSqlConnectionを作成しますが、cmdという名前のSqlCommandでは接続としてconを呼び出しています。これは問題です:

SqlConnection conn = new SqlConnection("connection info"); 
conn.Open(); 

string sql = "SQL command HERE"; 
SqlCommand cmd = new SqlCommand(sql, con); 
SqlDataReader reader = cmd.ExecuteReader(); 

これはなぜあなたにエラーを与えている可能性があります:

System.InvalidOperationException: There is already an open DataReader associated with this Command which must be closed first. 

第二に、あなたはあなたが使用して行われた後でCONNを閉じます:

conn.Close(); 

サード、あなたが使用するSqlDataReaderを閉じるために:

reader.Close(); 

しかし、SqlDataReaderをreaderに割り当てただけです。 SqlDataReaderを実際に開いたことはありません。それを開くには使用します。

reader.Read(); 

または:

while (reader.Read()) 
{ 
    // Code 
} 

を開いている間に接続し、SqlDataReaderのをinitilaizeし、それらを閉じるための適切な方法:

using (SqlConnection conn = new SqlConnection(sqlConnectionString)) 
{ 
    conn.Open(); 

    using (SqlCommand cmd = new SqlCommand()) 
    { 
     cmd.Connection = conn; 
     cmd.CommandText = "SELECT * FROM TableName;"; 

     SqlDataReader reader = cmd.ExecuteReader(); 

     reader.Read(); 

     if (reader.HasRows) 
     { 
      strCol1 = reader.GetValue(0).ToString(); 
     } 

     reader.Close(); 
    } 

    conn.Close(); 
} 
関連する問題