我有一台使用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);
}
}
这是我收到的异常消息:
执行超时已过期。在完成操作或服务器没有响应之前经过的超时时间
答案 0 :(得分:2)
指定实际的列数据库类型和最大长度,而不是AddWithValue
。例如:
command.Parameters.Add(parameter.Key, SqlDbType.VarChar, 30).Value = parameter.Value ?? Convert.DBNull);
这种做法将确保参数类型和长度与基础列的类型匹配,并有助于查询有效使用索引。 A big problem with AddWithValue
是它将使用字符串推断数据类型nvarchar
,这将防止使用SQL排序规则针对varchar列使用SARGable表达式。
SSMS查询运行快速的原因很可能是因为临时查询指定了varchar文字或变量。