SQL Server和VB.Net已经有与此连接关联的开放数据读取器

时间:2019-10-31 06:42:30

标签: vb.net

我发现由于此错误而无法完成查询插入。我尝试使用reader.close()方法来修复它,但它仍然显示此错误。我该如何解决以下代码?

Using Con As New SqlConnection
Con.ConnectionString = ConnectionStringStruct.DBconnectionMRs
    Try
       If Con.State = ConnectionState.Closed Then
       Con.Open()
       'Check user privilege in the database'
        Dim query As String = "select p.clinic_code,c.clinic_name, u.full_name, p.useable_status as status from [mrs].[dbo].[opd_create_appoint_table_privilege] p inner join [mrs].[dbo].[opd_user] u on p.user_name collate Thai_CS_AI = u.user_name inner join [mrs].[dbo].[clinic] c on p.clinic_code collate Thai_CS_AI = c.clinic_code where u.user_name = @username AND c.clinic_code = @clinic ORDER BY p.clinic_code ,c.clinic_name, u.full_name"
   Using cmd As New SqlCommand(query, Con)
        cmd.Parameters.Add("@username", SqlDbType.VarChar).Value = username_Search.Text
 cmd.Parameters.Add("@clinic", SqlDbType.VarChar).Value = clinicCode_Search.Text
   Using rd As SqlDataReader = cmd.ExecuteReader()
         If Not rd.HasRows Then

  Dim datanotfound As DialogResult = MessageBox.Show("datanotfound", "datanotfound", MessageBoxButtons.YesNo, MessageBoxIcon.Error)

             If (datanotfound = DialogResult.Yes) Then
                Dim insertquery = "INSERT INTO [mrs].[dbo]. [opd_create_appoint_table_privilege] VALUES(@clinic,@username,'Y',GETDATE(),GETDATE())" 
                Dim insertcmd As New SqlCommand(insertquery, Con)

                insertcmd.Parameters.Add("@username", SqlDbType.VarChar).Value = 
 username_Search.Text

                 insertcmd.Parameters.Add("@clinic", SqlDbType.VarChar).Value = 
  clinicCode_Search.Text
                 insertcmd.ExecuteNonQuery()
                 End If
         Else
             'read data'
           While rd.Read()
             status = rd("status").ToString()
             If (status = "Y") Then
             'Do something'

             Else
              'Do Something'

              End If
           End While
           rd.Close()
          End If
     End Using
     cmd.Dispose()
 End Using

3 个答案:

答案 0 :(得分:0)

在您的连接字符串中添加“ MultipleActiveResultSets = True”,一切都会正常工作

说明:您在一个连接中使用2个查询,一个连接不支持ExecuteReader和ExecuteNonQuery

答案 1 :(得分:0)

在使用完DataReader对象后,请尝试始终调用Close方法。

  dr.Close();

另一个选项,在您的连接字符串中,只需添加"MultipleActiveResultSets=True;"

Using Con As New SqlConnection
    Con.ConnectionString = ConnectionStringStruct.DBconnectionMRs
        Try
           If Con.State = ConnectionState.Closed Then
           Con.Open()
           'Check user privilege in the database'
           Dim query As String = "select p.clinic_code,c.clinic_name, u.full_name, p.useable_status as status from [mrs].[dbo].[opd_create_appoint_table_privilege] p inner join [mrs].[dbo].[opd_user] u on p.user_name collate Thai_CS_AI = u.user_name inner join [mrs].[dbo].[clinic] c on p.clinic_code collate Thai_CS_AI = c.clinic_code where u.user_name = @username AND c.clinic_code = @clinic ORDER BY p.clinic_code ,c.clinic_name, u.full_name"
           Using cmd As New SqlCommand(query, Con)
           cmd.Parameters.Add("@username", SqlDbType.VarChar).Value = username_Search.Text
           cmd.Parameters.Add("@clinic", SqlDbType.VarChar).Value = clinicCode_Search.Text
           Using rd As SqlDataReader = cmd.ExecuteReader()
               If Not rd.HasRows Then
                  rd.Close()
                  Dim datanotfound As DialogResult = MessageBox.Show("datanotfound", "datanotfound", MessageBoxButtons.YesNo, MessageBoxIcon.Error)
                  If (datanotfound = DialogResult.Yes) Then
                       Dim insertquery = "INSERT INTO [mrs].[dbo]. [opd_create_appoint_table_privilege] VALUES(@clinic,@username,'Y',GETDATE(),GETDATE())" 
                       Dim insertcmd As New SqlCommand(insertquery, Con)
                       insertcmd.Parameters.Add("@username", SqlDbType.VarChar).Value = username_Search.Text
                       insertcmd.Parameters.Add("@clinic", SqlDbType.VarChar).Value = clinicCode_Search.Text
                       insertcmd.ExecuteNonQuery()
                  End If
               Else
                  'read data'
                  While rd.Read()
                     status = rd("status").ToString()
                     If (status = "Y") Then
                        'Do something'
                     Else
                        'Do Something'
                     End If
                  End While
                  rd.Close()
              End If
          End Using
          cmd.Dispose()
     End Using

答案 2 :(得分:0)

无需检查.ConnectionState。您刚刚在上方3行创建了它。直到最后一刻才打开连接。那将在.ExecuteReader之上。

我切换了If和Else,因此当您的阅读器关闭时,我改变了主意,使用了DataTable。 .Load方法创建并关闭阅读器。

Private Sub OPCode()
    Dim status As String
    Dim dt As New DataTable
    Using Con As New SqlConnection(ConnectionStringStruct.DBconnectionMRs)
        'Check user privilege in the database'
        Dim query As String = "select p.clinic_code,c.clinic_name, u.full_name, p.useable_status as status from [mrs].[dbo].[opd_create_appoint_table_privilege] p inner join [mrs].[dbo].[opd_user] u on p.user_name collate Thai_CS_AI = u.user_name inner join [mrs].[dbo].[clinic] c on p.clinic_code collate Thai_CS_AI = c.clinic_code where u.user_name = @username AND c.clinic_code = @clinic ORDER BY p.clinic_code ,c.clinic_name, u.full_name"
        Using cmd As New SqlCommand(query, Con)
            cmd.Parameters.Add("@username", SqlDbType.VarChar).Value = username_Search.Text
            cmd.Parameters.Add("@clinic", SqlDbType.VarChar).Value = clinicCode_Search.Text

            Con.Open()
            dt.Load(cmd.ExecuteReader()) 'The reader is closed by the Load method after the table is filled
            If dt.Rows.Count > 0 Then
                'read data'
                For Each row As DataRow In dt.Rows
                    status = dt(3).ToString()
                    If (status = "Y") Then
                        'Do something'
                    Else
                        'Do Something'
                    End If
                Next
            Else
                'You haven't asked a yes/no question so what is the point of yes/no
                Dim datanotfound As DialogResult = MessageBox.Show("data not found", "data not found", MessageBoxButtons.YesNo, MessageBoxIcon.Error)
                If datanotfound = DialogResult.Yes Then
                    Dim insertquery = "INSERT INTO [mrs].[dbo]. [opd_create_appoint_table_privilege] VALUES(@clinic,@username,'Y',GETDATE(),GETDATE())"
                    Using insertcmd As New SqlCommand(insertquery, Con)
                        insertcmd.Parameters.Add("@username", SqlDbType.VarChar).Value = username_Search.Text
                        insertcmd.Parameters.Add("@clinic", SqlDbType.VarChar).Value = clinicCode_Search.Text
                        insertcmd.ExecuteNonQuery()
                    End Using
                End If
            End If
        End Using
    End Using

End Sub