2

我正在 Visual Studio 2008 的“sql server 2008 management edition”中创建与我的数据库的连接。

我在我的数据库中存储了一个名为“CTable”的过程,我想执行它。(来自Visual Studio)

这是我的代码:

    Dim strConn As String
    strConn = "Server=(local);Database=dbAjout;Integrated Security=True"

    Dim MyConn As New SqlConnection(strConn)
    MyConn.Open()
    Dim cmd As SqlCommand

    Dim query As String = "EXEC CTable"

    cmd = New SqlCommand(query, MyConn)

    MyConn.Open()
    cmd.ExecuteNonQuery()
    MyConn.Close()
End Sub

但我有这个错误:An unhandled exception of type 'System.InvalidOperationException' occurred in System.Data.dll

附加信息:连接未关闭。连接的当前状态是打开的。”

你有什么建议???我被阻止了,已经 4 小时了!!!!

4

2 回答 2

3

您打开连接两次。根据文档(SqlConnection.Open()):

异常
InvalidOperationException
- 无法在未指定数据源或服务器的情况下打开连接。
- 或
- 连接已打开。

那是(可能)导致InvalidOperationException抛出的原因。

于 2013-07-04T17:58:01.533 回答
1

将您的代码更改为:

Dim strConn As String
strConn = "Server=(local);Database=dbAjout;Integrated Security=True"

Dim MyConn As New SqlConnection(strConn)
Dim cmd As SqlCommand

Dim query As String = "EXEC CTable"

cmd = New SqlCommand(query, MyConn)

MyConn.Open()
cmd.ExecuteNonQuery()
MyConn.Close()

您应该考虑使用该语句为您调用Dispose模式,如下所示:SqlConnectionUsing

Dim strConn As String
strConn = "Server=(local);Database=dbAjout;Integrated Security=True"

Using MyConn As New SqlConnection(strConn)
    Dim cmd As SqlCommand
    Dim query As String = "EXEC CTable"

    cmd = New SqlCommand(query, MyConn)

    MyConn.Open()
    cmd.ExecuteNonQuery()
End Using

注意:该Using语句可以应用于任何实现该IDisposable接口的对象。在这种情况下,它将SqlConnection通过为您调用Close方法来自动关闭对象。在幕后,VB.NET 编译器将看到Using语句并将块包装Using在一个Try块中并给它一个Finally块,这就是将代表您调用SqlConnection'方法的地方。Close在我看来,这种语法使代码更易于阅读,更易于维护,因为您可以看到连接对象中包含的所有内容,并且无需“记住”关闭底层数据库连接。

于 2013-07-04T19:25:35.077 回答