SQL Server执行良好的SQL查询,但由ADO.NET执行时返回超时

时间:2019-04-28 14:20:56

标签: c# sql sql-server ado.net

我有一台使用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);
    }
}

这是我收到的异常消息:

  

执行超时已过期。在完成操作或服务器没有响应之前经过的超时时间

1 个答案:

答案 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文字或变量。