【发布时间】:2019-04-28 14:20:56
【问题描述】:
我有一台使用 ADO.NET 对 Azure SQL Server 执行 SQL 查询的服务器
当我尝试通过我的服务器(使用 ADO.NET)运行特定查询时,我收到超时错误,但是当我通过 SQL Server 执行相同的查询时,我会在 1-2 秒后获得结果。
我尝试在连接字符串和SqlCommand 对象中增加超时,但没有结果。
我看到了一种潜在的解决方案,可以将 SqlCommand 对象中的超时更改为 0,我尝试了很长时间后得到了结果,但它只适用于我的本地机器,而不适用于我的生产服务器
这是我在服务器中用于集成数据库的代码:
using (var connection = new SqlConnection(ConnectionString))
{
var command = new SqlCommand
{
CommandText = query
};
foreach ( var parameter in parameters)
command.Parameters.AddWithValue(parameter.Key, parameter.Value ?? Convert.DBNull);
command.Connection = connection;
try
{
_logger.Info("Open connection to db");
connection.Open();
_logger.Info("Execute command");
SqlDataReader reader = command.ExecuteReader();
List<Column> columns = CreateColumnList(reader);
}
catch (Exception e)
{
_logger.Error(e);
}
}
这是我收到的异常消息:
执行的超时已过期。完成操作之前超时时间已过或服务器没有响应
【问题讨论】:
-
要在 SSMS 中运行“相同查询”,您必须使用所有参数调用 sp_executesql。使用 TSQL 局部变量或文字值将产生不同的查询计划。
-
在发出查询后尝试监控您的数据库,看看是什么阻碍了它运行。也许它由于某种原因被锁定了。另外,我建议指定命令对象的类型,即 CommandType 属性,这样就不必推断它是文本(选择语句)还是存储过程。跨度>
-
我建议你避免使用AddWithValue。如果列类型为 varchar,则参数类型将为带有字符串的 nvarchar,因此如果您使用 SQL 排序规则,则不会使用键列上的索引。您可能在 SSMS 查询中使用了 varchar 文字或变量。
-
@DavidBrowne-Microsoft 有点额外 - 为了获得相同的执行计划,会话还必须包含相同的
set选项。 -
我同意大卫的观点。您应该使用 SQL Profiler 或扩展事件来捕获在 .NET 中执行的 T-SQL。然后在此线程中粘贴两个查询。
标签: c# sql sql-server ado.net