连接打开时连接状态为关闭错误

时间:2014-11-25 15:15:21

标签: vb.net visual-studio-2010

我收到以下错误:ExecuteNonQuery需要一个开放且可用的连接。连接的当前状态已关闭。

然而,在我的代码中,连接状态在抛出此异常之前打开。我不明白为什么它会被关闭?

代码:

Try

conn = New SqlConnection(connectionString)

If i = objId.Count - 1 Then
    cmd = New SqlCommand("Update DmdOD SET note = @note, note1 = @note1, noteBranch = @branch, noteAccountNo = @account," & _
    "noteType = @type, noteSub = @sub, lastUpdatedBy = @user  WHERE no = @no and id=@id", conn)
                        cmd.Parameters.Add(New SqlParameter("@id", objId.Item(i)))
End If

cmd.Parameters.Add(New SqlParameter("@note", ddl.SelectedItem.Text))

If ddlNote.SelectedItem.Text IsNot "" Then
   cmd.Parameters.Add(New SqlParameter("@note1", ddlNote.SelectedItem.Text))
Else
   cmd.Parameters.Add(New SqlParameter("@note1", DBNull.Value))
End If


If txtAccountBox.Text IsNot "" Then
   cmd.Parameters.Add(New SqlParameter("@account", txtAccountBox.Text))
Else
   cmd.Parameters.Add(New SqlParameter("@account", DBNull.Value))
End If

If txtSubBox.Text IsNot "" Then
   cmd.Parameters.Add(New SqlParameter("@sub", txtSubBox.Text))
Else
   cmd.Parameters.Add(New SqlParameter("@sub", DBNull.Value))
End If

cmd.Parameters.Add(New SqlParameter("@no", row.Cells(1).Text))

cmd.Parameters.Add(New SqlParameter("@user", HttpContext.Current.User.Identity.Name.ToString()))

If ddBranchBox.SelectedItem.Text IsNot "" Then
   cmd.Parameters.Add(New SqlParameter("@branch", ddBranchBox.SelectedItem.Text))
Else
   cmd.Parameters.Add(New SqlParameter("@branch", DBNull.Value))
End If

If ddTypeBox.SelectedItem.Text IsNot "" Then
   cmd.Parameters.Add(New SqlParameter("@type", ddTypeBox.SelectedItem.Text))
Else
   cmd.Parameters.Add(New SqlParameter("@type", DBNull.Value))
End If

conn.Open()
   cmd.ExecuteNonQuery() ' Where the exception is being thrown
conn.Close()

   cmd.Parameters.Clear()

   LblErr.ForeColor = Drawing.Color.Green
   LblErr.Text = "Data Saved!"

Catch ex As Exception
   LblErr.ForeColor = Drawing.Color.DarkRed
   LblErr.Text = "Save Button - " & ex.Message
Finally
   conn.Dispose()
End Try

2 个答案:

答案 0 :(得分:1)

您的实例“conn”

在代码的开头,您声明“conn”

conn = New SqlConnection(connectionString)

在打开连接之前,你再次这样做.. 删除第二个作业。

答案 1 :(得分:1)

您已创建两次连接。在构建SqlCommand时,您将该命令与之前创建的连接相关联,但随后又重新创建了连接,并且此新对象与命令的关联不再相同 -

添加参数后删除此行

  conn = New SqlConnection(connectionString)

但是,您应该始终包含一次性对象,例如与使用块的连接

Try

  Using conn = New SqlConnection(connectionString)
     .....
     create the command
     create the parameters
     ....
     cmd.ExecuteNonQuery() 

  End Using  ' Here the connection will be closed and disposed
Catch ex As Exception

End Try 

作为旁注,如果

,代码中会发生什么

如果我<> objId.Count - 1然后