Ошибка открытия хранилища данных на vb.net, если он не использовался ранее - PullRequest
0 голосов
/ 22 июня 2011

Привет, у меня есть этот саб, как часть моей системы входа / выхода.Когда эта подпрограмма вызывается для входа в систему, она работает отлично, но при выходе из системы она выдает ошибку, которая не имеет никакого смысла для меня.

Sub validate_session()
        Dim email As String = System.Web.HttpContext.Current.Session("email")
        Dim key As String = System.Web.HttpContext.Current.Session("sid")

        'check against db
        Dim objConnCheck As System.Data.SqlClient.SqlConnection
        Dim objCmdCheck As System.Data.SqlClient.SqlCommand
        Dim strConnStringCheck, strSQLCheck As String

        'establish connection
        objConnCheck = New SqlConnection(ConfigurationManager.ConnectionStrings("dbAlumniReadConnectionString").ConnectionString)
        objConnCheck.Open()

        strSQLCheck = "SELECT * FROM users WHERE email = @email AND session_key = @ssession_hash"
        objCmdCheck = New System.Data.SqlClient.SqlCommand(strSQLCheck, objConnCheck)

        With objCmdCheck
            .Parameters.Add(New SqlParameter("@email", email))
            .Parameters.Add(New SqlParameter("@ssession_hash", key))
        End With

        'take the approiate action
        Dim u As SqlDataReader = objCmdCheck.ExecuteReader()
        If u.HasRows = True Then
            Dim refresh = New hashing
            refresh.create_session_key(email)

        Else
            System.Web.HttpContext.Current.Session("email") = ""
            System.Web.HttpContext.Current.Session("sid") = ""

            'clean out db field
            'update db
            Dim objConnRemove As System.Data.SqlClient.SqlConnection
            Dim objCmdRemove As System.Data.SqlClient.SqlCommand
            Dim strConnStringRemove, strSQLRemove As String

            'establish connection
            objConnRemove = New SqlConnection(ConfigurationManager.ConnectionStrings("dbAlumniAdminConnectionString").ConnectionString)
            objConnRemove.Open()

            strSQLRemove = "UPDATE users SET session_key = "" WHERE email = @semail"
            objCmdRemove = New System.Data.SqlClient.SqlCommand(strSQLCheck, objConnCheck)

            With objCmdRemove
                .Parameters.Add(New SqlParameter("@semail", email))
            End With

            objCmdRemove.ExecuteNonQuery()

            objConnRemove.Close()
            objConnRemove.Close()

        End If

        objConnCheck.Close()
        objConnCheck.Close()

    End Sub

При запуске как часть логики выхода она выдает эту ошибку:

There is already an open DataReader associated with this Command which must be closed first. - objCmdRemove.ExecuteNonQuery() -

Это подпрограмма выхода из системы:

Sub logout() Handles Me.Load
    System.Web.HttpContext.Current.Session("email") = "ghost"
    Dim logging_out = New common
    logging_out.validate_session()

    Response.Redirect("login.aspx?l=out")

End Sub

Устанавливает бессмысленный адрес электронной почты, так что когда validate_session выполняет поиск действительного комбо-сообщения электронной почты / сеанса в БД, он отключает уничтожение.конфиденциальных данных сеанса.

Вопрос сводится к следующему: почему выдается ошибка, когда подпрограмма выхода из системы вызывает validate_session?

1 Ответ

1 голос
/ 22 июня 2011

Попробуйте утилизировать DataReader после того, как с ним покончено. как это:

u.Close()
u = Nothing

поэтому ваш код должен выглядеть как

Sub validate_session()

        [....]  'your code here

        Dim u As SqlDataReader = objCmdCheck.ExecuteReader()

        If u.HasRows = True Then
                 'Your code here
        Else
                 'Your other code goes here
        End If

        u.close             ' This is where you should pay attention
        u = Nothing

        [...]   'rest of your code here    
    End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...