88

我正在尝试覆盖SqlConnection15 秒的默认超时,但收到一条错误消息,提示

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

有没有解决的办法?

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();
    }
}
4

10 回答 10

170

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

它的用法是:

command.CommandTimeout = 60; //The time in seconds to wait for the command to execute. The default is 30 seconds.
于 2012-04-11T15:05:12.593 回答
43

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

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

于 2012-04-11T15:00:04.577 回答
22

更简洁的方法是在 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您创建的实例。创建实例时,您不会更改此值。

于 2015-05-27T08:42:42.883 回答
17

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

connect timeout=180;
于 2012-04-11T14:59:52.737 回答
9

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

于 2013-12-20T03:53:16.087 回答
9

您还可以使用 SqlConnectionStringBuilder

SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(ConnectionString);
builder.ConnectTimeout = 10;
using (var connection = new SqlConnection(builder.ToString()))
{
    // code goes here
}
于 2018-11-15T10:24:30.680 回答
6

旧帖子,但当它出现我正在搜索的内容时,我想我会在这个主题中添加一些信息。我打算添加评论,但我没有足够的代表。

正如其他人所说:

connection.ConnectionTimeout 用于初始连接

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

但:

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

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

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

于 2015-05-21T13:14:38.703 回答
6

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

将“Connection Timeout=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;
    }

}
于 2019-08-31T06:11:45.183 回答
2

你需要使用command.CommandTimeout

于 2012-04-11T15:05:12.343 回答
1

我发现了一篇关于这个主题的优秀博文: https ://improve.dk/controlling-sqlconnection-timeouts/

基本上,您可以在连接字符串中设置 Connect Timeout,如下所示:

Data Source=server;Initial Catalog=databaseUser Id=username;Password=password;Connect Timeout=30

或者您在命令对象上设置 ConnectionTimeout,如下所示:

sqlCommand.CommandTimeout = 30;

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

此外,此超时不考虑由于服务器死机或过载等情况而导致的连接丢失。这些最终会触发 TCP 超时。请参阅博客文章以获取一个很好的扩展示例来处理它。

于 2020-12-17T11:35:22.223 回答