更改SqlConnection超时


81

我试图覆盖默认SqlConnection的15秒超时,并收到一条错误消息,指出

无法分配属性或索引器,因为它是只读的。

有没有解决的办法?

using (SqlConnection connection = new SqlConnection(Database.EstimatorConnection))
{
   connection.Open();

   using (SqlCommand command = connection.CreateCommand())
   {
       command.CommandType = CommandType.StoredProcedure;
       connection.ConnectionTimeout = 180; // This is not working 
       command.CommandText = "sproc_StoreData";
       command.Parameters.AddWithValue("@TaskPlanID", order.Projects[0].TaskPlanID);
       command.Parameters.AddWithValue("@AsOfDate", order.IncurDate);

       command.ExecuteNonQuery();
    }
}

5
您是要在尝试打开连接后设置连接超时?你是说commandtimeout吗?
Alex K.

2
我真的,真的不明白为什么他们将该属性设置为只读。IMO,应该是可读写的。
xofz

连接后,该属性为只读。请参阅其他答复进行讨论。尝试连接时,ConnectionTimeout影响超时。对于Azure SQL DB来说,增加它通常很有用。运行查询时,CommandTimeout影响超时。
比尔·吉布森

@Sam Pearson它是可读写的,直到打开连接为止,即connection.Open();。叫做。至此,计时器已在运行。
WonderWorker

Answers:


155

如果要为特定查询提供超时,那么CommandTimeout是前进的方向。

它的用法是:

command.CommandTimeout = 60; //The time in seconds to wait for the command to execute. The default is 30 seconds.

15
他不是在谈论命令超时,而是在谈论连接超时。
拉里

39

您可以在连接字符串中设置超时值,但是在连接后它是只读的。您可以在http://msdn.microsoft.com/zh-cn/library/system.data.sqlclient.sqlconnection.connectiontimeout.aspx中阅读更多内容

正如Anil所暗示的那样,ConnectionTimeout可能不是您所需要的;它控制建立新连接时ADO驱动程序将等待多长时间。您的用法似乎表明需要等待比通常的更长的时间来执行特定的SQL查询,在这种情况下,Anil是完全正确的。使用CommandTimeout(R / W)更改单个SqlCommand的预期完成时间。


19

一种更干净的方法是在xml文件中设置connectionString,例如Web.Confing(WepApplication)App.Config(StandAloneApplication)

 <connectionStrings>
    <remove name="myConn"/>
    <add name="myConn" connectionString="User ID=sa;Password=XXXXX;Initial Catalog=qualitaBorri;Data Source=PC_NAME\SQLEXPRESS;Connection Timeout=60"/>
  </connectionStrings>

通过代码,您可以通过以下方式获得连接:

public static SqlConnection getConnection()
{
        string conn = string.Empty;
        conn = System.Configuration.ConfigurationManager.ConnectionStrings["myConn"].ConnectionString;
        SqlConnection aConnection = new SqlConnection(conn);
        return aConnection;
}

您只能设置ConnectionTimeout创建实例。创建实例后,您无需更改此值。


17

您可以随时将其添加到连接字符串中:

connect timeout=180;

2
连接超时与CommandTimeout不同。连接超时用于解决与数据库的初始连接所花费的时间。CommandTimeout更改特定查询的超时时间。
m0g 2014年

@ m0g我不明白为什么这不是公认的答案。这里的问题可能是关于连接超时的,非常清楚,默认值为15,它是SqlConnection的只读属性,必须在连接字符串中定义。发布者列出的代码行专门尝试设置SqlConnection.ConnectionTimeout。命令超时默认为30,并且是完全不同的对象SqlCommand的读/写参数。问题的错误消息显示值为15,问题专门显示为SqlConnection,而不是SqlCommand。
培根

1
@BaconBits问题张贴者描述和询问的内容与他想要的是不同的,因此可接受的答案有所不同。
m0g

8

您可以添加Connection Timeout=180;到您的连接字符串


4
连接超时与CommandTimeout不同。连接超时用于解决与数据库的初始连接所花费的时间。CommandTimeout更改特定查询的超时时间。
m0g 2014年

7

您也可以使用SqlConnectionStringBuilder

SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(ConnectionString);
builder.ConnectTimeout = 10;
using (var connection = new SqlConnection(builder.ToString()))
{
    // code goes here
}

6

旧帖子,但是由于我要搜索的内容,我认为我应该向该主题添加一些信息。我本打算添加评论,但是我没有足够的代表。

正如其他人所说:

connection.ConnectionTimeout用于初始连接

command.CommandTimeout用于单个搜索,更新等。

但:

connection.ConnectionTimeout用于提交和回滚事务。

是的,这是绝对疯狂的设计决定。

因此,如果在提交或回滚时遇到超时,则需要通过连接字符串增加此值。


“ Connection.ConnectionTimeout也用于提交和回滚事务。是的,这是绝对疯狂的设计决策。” 真?我不相信这是真的。如果为true,则任何持续时间超过15秒连接超时的事务都将失败。您需要澄清。
Triynko

现在,如果您的意思是它被用作仅提交commit或rollback命令的超时,那么不……这不是一个疯狂的决定。它基本上是一个即时命令,应该立即返回,因为它只是发信号通知服务器进行提交或回滚。如果它无法到达服务器并立即获得响应,则基本上是连接超时,这就是使用这种方式有意义的原因。
Triynko

3

您可以将连接超时设置为连接级别和命令级别。

在连接字符串中添加“连接超时= 10”。现在连接超时为10秒。

var connectionString = "Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;Connection Timeout=10";
using (var con = new SqlConnection(connectionString))
{

}

将CommandTimeout属性的设置为SqlCommand

var connectionString = "Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword";
using (var con = new SqlConnection(connectionString))
{

    using (var cmd =new SqlCommand())
    {
        cmd.CommandTimeout = 10;
    }

}

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.