2009-05-08 67 views
8

今週のこのエラーについて尋ねました。非常に有益な回答がありました。ExecuteReaderには、オープンで使用可能な接続が必要です。接続の現在の状態は閉じています

しかし、今私はデータベースにアクセスするために「正しい」ベストプラクティスの方法を使用していますが、私はまだこのエラーをいくつかの関数で受け取り、そのブロックでは消えることはできません。今に関係なく、私は私が得る何

Public Shared Function doesBasketExist(ByVal baskethash As String) As Boolean 
    Dim _r As Boolean 
    Using db As New SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings("pitstopConnectionString").ConnectionString) 
     Using cmd As New SqlCommand("doGetBasketByHash", db) 
      cmd.CommandType = CommandType.StoredProcedure 
      cmd.Parameters.AddWithValue("@baskethash", baskethash) 
      Using dr As SqlDataReader = cmd.ExecuteReader() 
       If dr.HasRows() = True Then 
        _r = True 
       Else 
        _r = False 
       End If 
       dr.Close() 
      End Using 
     End Using 
    End Using 
    Return _r 
End Function 

:ここに私のコードではないのExecuteReaderがオープンし、利用可能な接続が必要です。接続の現在の状態は閉じられています。これに関連して。私は、このクラス(cmd、drなど)内で同じものと呼ばれるオブジェクトを持つ関数を持っていますが、Useはそれ自身の後で閉じますか?

提案歓迎:)

答えて

14

私はあなたが接続を開くことを忘れてしまったと思います。

この行の前にそれを開きます。

cmd.Parameters.AddWithValue("@baskethash", baskethash) 

使用 - あなたが実際にOpen接続するのを忘れて

db.Open() 
2

このため
 db.Open() 
     Using dr As SqlDataReader = cmd.ExecuteReader() 
1

一つの理由は次のようになり、あなたの接続ができること全く開かないでください。 "SqlConnection.Open"ステートメントで何が例外になるのかが抑制されています。アプリケーションに問題がない場合は、サーバーが接続を許可できない可能性があります。あなたのアプリや同じサーバにホストされている他のデータベースの接続リークが原因である可能性があります。

関連する問題