11
using System;
using System.Collections.Generic;
using System.Text;
using System.Data.Sql;
using System.Data.SqlClient;

namespace BissUpdater
{
    class Program
    {
        static void Main(string[] args)
        {
            string connectionString = "Data Source=H....; 
                Initial Catalog=LANDesk; Persist Security Info=True; 
                User ID=Mainstc; Password=xxxxxxxx";

            SqlConnection con = new SqlConnection(connectionString);
            con.Open();
        }
    }
}

SQL 连接引发了无效操作异常。

“无效操作。连接已关闭”。

这是我的完整代码。在其他程序中,它运行完美。

这是第二次了,没用。我正在使用 VS2005 ...也许我的程序已损坏?

堆栈跟踪:

在 System.Data.SqlClient.SqlConnection.GetOpenConnection()
在 System.Data.SqlClient.SqlConnection.get_ServerVersion()

4

6 回答 6

17

这样做的正确方法应该是:

static void Main(string[] args) {
    string connectionString = "Data Source=H....; 
    Initial Catalog=LANDesk;User ID=Mainstc; Password=xxxxxxxx"; 
    // removed Persist Security Info=True; 


    using(SqlConnection con = new SqlConnection(connectionString))
    {
      if (con.State==ConnectionState.Closed)
      {                      
          con.Open();   
      }
    }


}

使用Using Statement它会自动处理你的 SQL 连接。

还要检查这个:MSDN 上使用 ADO.NET 的最佳实践

其他要做的事情:使用 SQL Management Studio 并尝试使用连接字符串中的 sql 身份验证登录凭据,如果您已使用该帐户成功连接到数据库,则上述代码应该适合您。

最好的祝福

于 2013-03-22T09:03:36.940 回答
2

代码应阅读

using (SqlConnection con = new SqlConnection(connectionString))
{
    con.Open();

    ...
}
于 2013-03-22T09:03:58.833 回答
0

尝试添加此代码。您可能已打开连接,并且在重新运行程序时您尝试再次打开连接,或者您的服务器或连接字符串有问题

con.Close();

有关更多信息,请参见此处http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.open.aspx

于 2013-03-22T09:02:46.493 回答
0

您可以在打开它之前检查连接状态试试这个:

SqlConnection con = new SqlConnection(connectionString);
if (con.State==ConnectionState.Closed)
{                      
    con.Open();   
}

// here your code goes for sql operations

con.Close();
于 2013-03-22T09:03:21.950 回答
0

尝试使用using语句。在大型数据库的情况下直接手动打开和关闭数据库是个坏主意。

using(SqlConnection con = new SqlConnection(connectionString))

尝试这样做以打开和关闭连接>>

public DB(string conStr):base()
{
con = new OracleConnection(conStr);
con.Open();
}


public void Close()
{
con.Close();
//con.Dispose();

} 

希望有帮助。

于 2013-03-22T09:03:37.227 回答
0

我遇到了同样的问题,我在 VB 中的解决方案是:

Dim db As New Database

' ... Some Work with EF without procedures (90 seconds)

db.SaveChanges()

For Each p In list

    If db.Database.Connection.State <> ConnectionState.Open Then
        ' This is only executed 1 time
        db.Database.Connection.Open()
    End If

    ' ... Some Work with EF but calling a mapped procedure (1 or 2 seconds each call)
    db.MyProcedure(p.FieldId)

Next

db.Dispose()

但是总时间是 200 秒,所以我不得不在我WebConfigWebService:

<system.web>
    <httpRuntime executionTimeout="600" /> <!--10 min-->
...
于 2019-06-19T09:24:50.113 回答