2009-05-08 3 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 и т. Д.), Но использование закрывается после себя, не так ли?

Предложения приветствуются :)

ответ

14

Я думаю, что вы забыли открыть соединение.

Откройте его до этой строки:

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

Использование -

db.Open() 
2

Вы на самом деле забыл Open связи:

 db.Open() 
     Using dr As SqlDataReader = cmd.ExecuteReader() 
1

Одной из причин этого будет то, что ваше соединение может не открывается вообще. Любое исключение, которое приходит в выражении «SqlConnection.Open», подавляется. Если проблема не в вашем приложении, возможно, сервер не может предоставить вам соединение. Может быть из-за утечки соединения в вашем приложении или в какой-либо другой базе данных, размещенной на том же сервере.