ExecuteReader требует открытого и доступного соединения - текущее состояние закрыто - PullRequest
1 голос
/ 28 февраля 2020

все.
Я боролся с этой проблемой, так как она подняла голову поздно вечером.
Не уверен, ПОЧЕМУ это происходит, но это так. То, что раньше работало только с ONE Artistcon.open ()
Теперь требуется, чтобы оно было у меня при каждом новом "ExecuteReader".
Ниже приведен пример кода. Начиная со строки подключения, а затем фактического кода.
У меня есть строка, помеченная ниже, для удобства поиска.

Я пытался поместить ArtistCon.open () в область кода, над оператором select в этой области, но он выдает ошибку,

web.config => database.config

<connectionStrings>
<add name ="Local" connectionString="Data Source=ServerName\InstanceName;Database=DatabaseName;User ID=UserName;Password=********;MultipleActiveResultSets=True"/>
</connectionStrings>

default.vb.aspx

Dim Artistcon As New SqlConnection
Artistcon = New SqlConnection(ConfigurationManager.ConnectionStrings("Local").ConnectionString)

    Artistcon.Open()
    Dim chWriters As New SqlCommand("SELECT TrackID, WID FROM Tracks WHERE (TrackFileName = @TrackFileName)", Artistcon)
   chWriters.Parameters.Add(New SqlParameter("@TrackFileName", getfile & ".mp3"))
    Dim rschhWriters As SqlDataReader
     rschhWriters = chWriters.ExecuteReader(Data.CommandBehavior.CloseConnection)
     If rschhWriters.Read() Then

     Dim sW As String = strWriters
     Dim leftString = sW.Substring(0, sW.IndexOf("["))
     Dim Wparts As String() = leftString.Split(New Char() {"/"c})

                        ' Loop through result strings with For Each.
     Dim Wpart As String

     For Each Wpart In Wparts
     Dim theWriters As String = Replace(Wpart, " ", "_")

     Dim getWriters As New SqlCommand("SELECT WritersID, WName FROM Writer WHERE (WName = @WName)", Artistcon)
     getWriters.Parameters.Add(New SqlParameter("@WName", theWriters.TrimEnd(CChar("_"))))
     Dim rsWriters As SqlDataReader
     ' =================ERROR LINE BELOW=================
     ' ExecuteReader requires an open and available Connection. The connection's current state is closed.
     rsWriters = getWriters.ExecuteReader(Data.CommandBehavior.CloseConnection) <<< ERROR LINE
     ' =================ERROR LINE ABOVE=================
     If Not rsWriters.Read() Then ' If record exist

     lblWriter.Text = "Insert WName=" & Wpart
     strWriters = "INSERT INTO Writer(WName)VALUES(@WName)"
     WriterCMD = New SqlCommand(strWriters, Artistcon)
     WriterCMD.Parameters.Add(New SqlParameter("@WName", theWriters.TrimEnd(CChar("_"))))
     Try
       WriterCMD.ExecuteNonQuery()
     Catch ex As Exception
     Finally

    End Try
    End If
    rsWriters.Close()
    getWriters.Dispose()

У меня не было проблем с этим кодом до тех пор, пока я не начал добавлять его и изменять код, а затем внезапно Я начал получать эту ошибку на каждой вложенной записи, и мне пришлось помещать ArtistCon.open () на каждый ExecuteReader, а затем я получаю эту ошибку во вложенном выражении.

Спасибо.

1 Ответ

1 голос
/ 28 февраля 2020

Вы специально просите закрыть соединение с этим вызовом:

Dim rschhWriters As SqlDataReader
rschhWriters = chWriters.ExecuteReader(Data.CommandBehavior.CloseConnection)

Так что попробуйте изменить его на

Dim rschhWriters As SqlDataReader = chWriters.ExecuteReader()

Примечание: предпочитайте использовать одноразовые предметы с помощью - Конец использования блоков. Ваш пустой Try-Catch тоже проблематичен c, потому что вы скрываете проблемы, которые потом будет сложно отлаживать. Вы хотите увидеть любые исключения, чтобы изменить код, чтобы они не происходили.

...