错误'已经有一个与此命令关联的打开DataReader,必须先关闭它。'

时间:2015-02-02 09:17:12

标签: vb.net sql-server-2008

我使用下面的代码但它在句子icount = cmd.ExecuteNonQuery

上给出了错误
cn.Open()
str = "SELECT [srno],[caste]FROM [SchoolERP].[dbo].[caste] where (caste ='" + (TextBox1.Text) + "')"
cmd = New SqlCommand(str, cn)
dr1 = cmd.ExecuteReader()

If Not dr1.HasRows Then
    str = "INSERT INTO [SchoolERP].[dbo].[caste]([caste])VALUES('" + TextBox1.Text + "')"
    cmd = New SqlCommand(str, cn)
    icount = cmd.ExecuteNonQuery
    MessageBox.Show(icount)

Else
    MsgBox("Record Exists")
    cn.Dispose()
End If
cn.Close()

5 个答案:

答案 0 :(得分:4)

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

  dr1.Close();

另一个选项是打开MARS,在连接字符串中添加"MultipleActiveResultSets=True;"

答案 1 :(得分:1)

试试这个:

Try 
    insert data in combobox 
    cmd.Connection = con 
    cmd.CommandText = "select name from party" 
    dr = cmd.ExecuteReader() 
    cb_ms.Items.Add("---Select---") 
    cb_ms.SelectedIndex = 0 
    While dr.Read() 'get error here.'
         cb_ms.Items.Add(dr("name")) 
    End While

    dr.Close()

Catch ex As Exception
    MessageBox.Show(ex.Message)
End Try

答案 2 :(得分:0)

我得到了答案......我只是在icount = cmd.ExecuteNonQuery这句话之前关闭连接并再次打开连接...及其作品...... 谢谢迪沙..

答案 3 :(得分:0)

您可以在第二次查询之前关闭datareader,但最好还是将其全部放入单个查询中。此外,你真的需要关闭那个糟糕的SQL注入问题。

尝试此操作来解决这两个问题:

Dim sql As String = _
  "IF NOT EXISTS    
    (
      SELECT 1 FROM [SchoolERP].[dbo].[caste] where (caste = @caste )   
    )    
    BEGIN
        INSERT INTO [SchoolERP].[dbo].[caste]([caste])VALUES( @caste)
    END"

Using cn As New SqlConnection("connection string here"), _
      cmd As New SqlCommand(sql, cn)

    'Use actual columnn type from the database here
    cmd.Parameters.Add("@caste", SqlDbType.NVarChar, 50).Value = TextBox1.Text

    cn.Open()
    icount = cmd.ExecuteNonQuery()
    MessageBox.Show(icount)
End Using

答案 4 :(得分:0)

使用Try .. Catch ..最后......结束尝试这样的事情:

 Try
   cn.Open()
    str = "SELECT [srno],[caste]FROM [SchoolERP].[dbo].[caste] where (caste               ='" + (TextBox1.Text) + "')"
    cmd = New SqlCommand(str, cn)
    dr1 = cmd.ExecuteReader()

    If Not dr1.HasRows Then
       str = "INSERT INTO [SchoolERP].[dbo].[caste]([caste])VALUES('" +     TextBox1.Text + "')"
       cmd = New SqlCommand(str, cn)
       icount = cmd.ExecuteNonQuery
       MessageBox.Show(icount)

   Else
       MsgBox("Record Exists")
       cn.Dispose()
   End If
       cn.Close()
 Catch error As Exception
   ........
 Finally
      dr1.Close
 End Try