Недопустимая попытка вызвать Read при закрытом считывателе. vb.net

У меня в WinForm есть эта подпрограмма:

Public Function CheckSentToday(ByVal date1 As DateTime) As Boolean
    Dim cmSql As New SqlCommand("Check_Today", cnSql)
    Try
        cmSql.CommandType = CommandType.StoredProcedure
        cmSql.Parameters.AddWithValue("@date1", String.Format("{0:yyyy-MM-dd}", date1))
        If Not cnSql Is Nothing AndAlso cnSql.State = ConnectionState.Closed Then cnSql.Open()
        If cmSql.ExecuteScalar IsNot Nothing Then
            Return True
        Else
            Return False
        End If
    Catch ex As Exception
        WriteToText("CheckSentToday", ex.ToString)
        CheckSentToday = False
    Finally
        If Not cnSql Is Nothing AndAlso cnSql.State = ConnectionState.Open Then cnSql.Close()
    End Try

End Function

Я открываю соединение перед выполнением SqlCommand,

и закрытие соединения в предложении finally

Тем не менее, он возвращает следующую ошибку при каждом вызове этой подпрограммы:

Description:System.InvalidOperationException: Invalid attempt to call Read when reader is closed.
   at System.Data.SqlClient.SqlDataReader.ReadInternal(Boolean setTimeout)
   at System.Data.SqlClient.SqlDataReader.Read()
   at System.Data.SqlClient.SqlCommand.CompleteExecuteScalar(SqlDataReader ds, Boolean returnSqlValue)
   at System.Data.SqlClient.SqlCommand.ExecuteScalar()

Может ли кто-нибудь помочь мне понять, почему?

Любая помощь будет оценена


person HelpASisterOut    schedule 14.08.2014    source источник


Ответы (1)


Вместо этого используйте Using-оператор и не используйте повторно SqlConnection:

Public Function CheckSentToday(ByVal date1 As DateTime) As Boolean
    Using cnSql = New SqlConnection("connection-string")
        Using cmSql As New SqlCommand("Check_Today", cnSql)
            cmSql.CommandType = CommandType.StoredProcedure
            cmSql.Parameters.AddWithValue("@date1", String.Format("{0:yyyy-MM-dd}", date1))
            Try
                cnSql.Open()
                If cmSql.ExecuteScalar IsNot Nothing Then
                    Return True
                Else
                    Return False
                End If
            Catch ex As Exception
                WriteToText("CheckSentToday: ", ex.ToString)
                CheckSentToday = False
            End Try
        End Using
    End Using
End Function
person Tim Schmelter    schedule 14.08.2014