如何延长 SQL 查询的超时时间
Posted
技术标签:
【中文标题】如何延长 SQL 查询的超时时间【英文标题】:How to extend the timeout of a SQL query 【发布时间】:2010-11-09 20:32:57 【问题描述】:这不是连接超时,因为与数据库的连接正常。问题是我调用的存储过程花费的时间超过 30 秒并导致超时。
函数的代码如下所示:
SqlDatabase db = new SqlDatabase(connectionManager.SqlConnection.ConnectionString);
return db.ExecuteScalar(Enum.GetName(typeof(StoredProcs), storedProc), parameterValues);
ExecuteScalar 调用超时。如何延长此功能的超时时间?
对于快速存储过程,它可以正常工作。但是,其中一个功能需要一段时间并且调用失败。当以这种方式调用 ExecuteScalar 函数时,我似乎找不到任何方法来延长超时时间。
【问题讨论】:
好的,否决我的问题只是粗鲁。我的问题已经明确定义并且(希望)有答案。 【参考方案1】:如果您正在使用 EnterpriseLibrary(看起来您正在使用),请尝试以下操作:
Microsoft.Practices.EnterpriseLibrary.Data.Database db = Microsoft.Practices.EnterpriseLibrary.Data.DatabaseFactory.CreateDatabase("ConnectionString");
System.Data.Common.DbCommand cmd = db.GetStoredProcCommand("StoredProcedureName");
cmd.CommandTimeout = 600;
db.AddInParameter(cmd, "ParameterName", DbType.String, "Value");
// Added to handle paramValues array conversion
foreach (System.Data.SqlClient.SqlParameter param in parameterValues)
db.AddInParameter(cmd, param.ParameterName, param.SqlDbType, param.Value);
return cmd.ExecuteScalar();
编辑为直接基于 cmets 处理 paramValues 数组。我还包括了您的 ConnectionString 值:
Microsoft.Practices.EnterpriseLibrary.Data.Database db = Microsoft.Practices.EnterpriseLibrary.Data.DatabaseFactory.CreateDatabase(connectionManager.SqlConnection.ConnectionString);
System.Data.Common.DbCommand cmd = db.GetStoredProcCommand("StoredProcedureName", parameterValues);
cmd.CommandTimeout = 600;
return cmd.ExecuteScalar();
【讨论】:
嗯...我无权访问 ParameterNames。我的示例代码中的 parameterValues 变量被定义为“object[] parameterValues”。在不知道名称的情况下,我仍然可以添加参数吗? 我添加了将 paramValues 数组转换为 DbCommand 预期参数的代码。 不需要。您只需将其添加到 GetStoredProcCommand 命令即可。 不错的发现,已编辑以显示“正确”的解决方案。这解决了您的问题吗? 我还不确定。我刚刚进行了更改以进行测试,但它不起作用。我还在修修补补,解决后会报告。【参考方案2】:您可以通过设置 SqlCommand.CommandTimeout 属性来做到这一点
【讨论】:
如果我使用 SqlCommand 会很好用……但是,我不是。 是的,你是。 SqlDatabase 不是标准数据提供者的一部分;这是一个有人写的包装类,内部会使用一个SqlCommand对象。 “某人”可能是微软——这是来自 Microsoft.Practices.EnterpriseLibrary 的 SQLDatabase 类吗? @Joel,该函数是在一个名为 Microsoft.Practices.EnterpriseLibrary.Data.dll 的文件中定义的,嗯……不确定我是否有源代码。正在搜索... 重写它以使用 db.CreateConnection();您将有 4-5 行额外的代码,但可以轻松访问 SqlCommand 对象。【参考方案3】:我认为这可能是一种更好的方法(从 Enterprise Library 6.0 开始):
SqlDatabase db = new SqlDatabase(connectionManager.SqlConnection.ConnectionString);
System.Data.Common.DbCommand cmd = db.GetStoredProcCommand(storedProc, parameterValues);
cmd.CommandTimeout = 600;
return db.ExecuteScalar(cmd);
【讨论】:
谢谢哥们,这节省了我很多时间。非常感谢【参考方案4】:试试这个
SqlConnectionStringBuilder connectionStringBuilder = new SqlConnectionStringBuilder(connection.ConnectionString);
connectionStringBuilder.ConnectTimeout = 180;
connection.ConnectionString = connectionStringBuilder.ConnectionString;
connection.Open();
SqlCommand command = new SqlCommand("sp_ProcedureName", connection);
command.CommandType = CommandType.StoredProcedure;
command.CommandTimeout = connection.ConnectionTimeout;
command.ExecuteNonQuery();
connection.Close();
【讨论】:
【参考方案5】:Mladen 是对的,但如果你必须这样做,你可能会对 proc 本身有更大的问题。在负载下,它可能需要比您的新超时时间更长的时间。可能值得花一些时间在 proc 上进行优化。
【讨论】:
感谢您告诉我去优化我的应用程序。叹。从长远来看,这可能会发生,但今天我只需要让这件事运行起来。 我当然没有冒犯的意思。只是如果 SQL 超时,您不太可能找到适用于所有情况的超时 #。在许多情况下,您希望 SQL 超时,而默认值仍然很长。【参考方案6】:由于 Microsoft 问题,可能会发生超时。我的 Windows 8 系统上似乎仍然存在。
http://support.microsoft.com/kb/2605597?wa=wsignin1.0
【讨论】:
以上是关于如何延长 SQL 查询的超时时间的主要内容,如果未能解决你的问题,请参考以下文章