我收到以下错误: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
答案 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然后