我发现由于此错误而无法完成查询插入。我尝试使用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
答案 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