改变SqlConnection的超时时间

95

我正在尝试覆盖默认的SqlConnection超时时间,但出现错误提示:

属性或索引器因为只读无法分配。

是否有解决方法?

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
你的意思是在尝试打开连接后设置连接超时吗?你的意思是命令超时吗? - Alex K.
2
我真的,真的不明白为什么他们把这个属性设为只读。在我看来应该是可读写的。 - xofz
1
连接后该属性为只读。请参见其他响应以进行讨论。ConnectionTimeout影响连接尝试的超时时间。对于Azure SQL DB,增加此值通常很有用。CommandTimeout影响运行查询时的超时时间。 - Bill Gibson - MSFT
1
@Sam Pearson在连接打开之前,它是可读可写的,也就是说,在调用connection.Open();时。从这一点开始计时器已经在运行了。 - WonderWorker
10个回答

187

如果您想为特定查询设置超时时间,则应使用CommandTimeout。

它的用法是:

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

32
他说的不是命令超时,而是连接超时。 - LarryBud

45

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

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


24

一种更清晰的方法是在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;

5
连接超时(Connection Timeout)和命令超时(CommandTimeout)是不同的。连接超时是指解析到数据库的初始连接所需的时间。而命令超时则是更改特定查询的超时时间。 - m0g
@m0g 我不明白为什么这个答案不被接受。 这里的问题很明显是关于Connection Timeout,它默认为15,是 SqlConnection 的只读属性,必须在 Connection String 中定义。 发帖者列出的代码行特别试图设置 SqlConnection.ConnectionTimeout。Command Timeout 默认值为30,是 SqlCommand 的可读/写参数,是一个完全不同的对象。 问题的错误消息显示一个值为15,并且问题明确指出了 SqlConnection,而不是 SqlCommand。 - Bacon Bits
3
@BaconBits,问题发布者所描述和询问的与他想要的不同,因此被接受的答案也不同。 - m0g

13

您还可以使用 SqlConnectionStringBuilder

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

9
您可以在连接字符串中添加Connection Timeout=180;

5
连接超时和命令超时是不同的。连接超时是指解析到数据库的初始连接所需的时间。而命令超时则是更改特定查询的超时时间。 - m0g

7

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

将 "Connection Timeout=10" 添加到连接字符串中。现在连接超时为10秒。

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

}

将SqlCommand的CommandTimeout属性设置为。
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;
    }

}

我认为你的答案最干净。我的应用程序是通过CLI进行的,我喜欢添加到连接字符串。谢谢。 - Mark Longmire

6

虽然这篇文章有点旧,但由于我正在搜索的内容与此相关,我想在这个话题上增加一些信息。本来想加评论,但是我声望不够。

正如其他人所说:

connection.ConnectionTimeout用于初始连接

command.CommandTimeout用于单独的搜索、更新等操作。

但是:

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

是的,这是一个绝对疯狂的设计决策。

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


"Connection.ConnectionTimeout也用于提交和回滚事务。是的,这是一个绝对疯狂的设计决策。" 真的吗?我不相信这是真的。如果是真的,那么任何持续时间超过15秒的事务都会失败。你需要澄清一下。 - Triynko
现在,如果您指的是将其用作仅提交提交或回滚命令的超时时间,那么不...那不是一个疯狂的决定。它基本上是一个即时命令,应该立即返回,因为它只是向服务器发出提交或回滚的信号。如果它无法立即到达服务器并获得响应,则基本上是连接超时,这就是为什么以这种方式使用它是有意义的原因。 - Triynko

3
我在这个主题上找到了一篇优秀的博客文章:https://improve.dk/controlling-sqlconnection-timeouts/ 基本上,你可以像这样在连接字符串中设置“连接超时”: ```html ```
Data Source=server;Initial Catalog=databaseUser Id=username;Password=password;Connect Timeout=30

或者您可以像这样在命令对象上设置ConnectionTimeout:

sqlCommand.CommandTimeout = 30;

注意,超时时间以秒为单位。

此外,此超时不考虑由于死机或过载服务器等情况导致的连接丢失。这些情况将最终触发TCP超时。请参见博客文章了解处理这种情况的良好扩展示例。


你好,欢迎来到SO!请阅读tour如何撰写优秀答案?添加代码示例总是很有帮助的。 - Tomer Shetah
请避免仅使用链接,因为链接可能会在未来更改。如果需要,请添加一些有价值的提示和源代码以帮助澄清您的答案。 - ColinWa

2

你需要使用 command.CommandTimeout


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接