Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 连接到数据库时发生SQL超时错误_C#_Sql Server_Database - Fatal编程技术网

C# 连接到数据库时发生SQL超时错误

C# 连接到数据库时发生SQL超时错误,c#,sql-server,database,C#,Sql Server,Database,我正在运行一个C#应用程序,它根据输入重复查询SQL Server 10.50.1617上的数据库。SQL查询是应用程序中嵌入的资源。在过去,它运作良好。最近,我们经常遇到SQL“timeout expired”错误,现在正是程序永远无法完成的时候。我试图改变程序与数据库连接的逻辑,这样查询会更小,但数量更多。这没有任何效果 此外,从调试中我看到超时是随机发生的。例如,有时它甚至无法完成一个查询(直接在SSMS中完成时所需时间不到1秒)。其他时间,它将在第900次查询时超时 我对这个话题做了一些

我正在运行一个C#应用程序,它根据输入重复查询SQL Server 10.50.1617上的数据库。SQL查询是应用程序中嵌入的资源。在过去,它运作良好。最近,我们经常遇到SQL“timeout expired”错误,现在正是程序永远无法完成的时候。我试图改变程序与数据库连接的逻辑,这样查询会更小,但数量更多。这没有任何效果

此外,从调试中我看到超时是随机发生的。例如,有时它甚至无法完成一个查询(直接在SSMS中完成时所需时间不到1秒)。其他时间,它将在第900次查询时超时

我对这个话题做了一些研究,发现其他人也有类似的问题(例如,这篇文章:)

似乎提供了一些有用的建议,关于如何处理事务等。但是,我认为我在集成C#(我通过Visual Studio使用)和数据库等主题方面的背景要差得多。所以我发现这些问题的答案很难理解。更糟糕的是,我正试图在其他人的代码中修复这个问题,而这不是我最初编写的

我希望有人能提供一个门外汉的一些事情,我可能想研究更多的解释,因为我收到了这个错误。我对这一点真的很陌生,虽然我理解大多数术语,但我仍然对所有的运动部件感到困惑

<>我的代码的哪些方面我可能想查看或考虑重做?这可能是我的C#代码的问题,还是数据库的问题(自最初编写此应用程序以来,数据库已经变得越来越大,并且一直如此)?任何建议都将不胜感激,请让我知道我可以提供的任何其他信息

protected IEnumerable<IDictionary<string, object>> ExecuteQuery(
            string query,
            IDictionary<string, object> parameters,
            IEqualityComparer<string> comparer = null)
        {

            using (DbCommand command = GetCommand())
            {
                command.CommandText = query;
                if (parameters != null)
                {
                    foreach (var pair in parameters)
                    {
                        DbParameter parameter = command.CreateParameter();
                        parameter.ParameterName = string.IsNullOrEmpty(ParameterPrefix)
                            ? pair.Key
                            : ParameterPrefix + pair.Key;
                        parameter.Value = pair.Value == null ? DBNull.Value : pair.Value;
                        command.Parameters.Add(parameter);
                    }
                }
                using (DbDataReader reader = command.ExecuteReader())
                {
                    while (reader.Read())
                    {
                        var dict = comparer == null
                            ? new Dictionary<string, object>(reader.FieldCount)
                            : new Dictionary<string, object>(reader.FieldCount, comparer);
                        for (int i = 0; i < reader.FieldCount; ++i)
                        {
                            dict[reader.GetName(i)] = reader[i] == DBNull.Value ? null : reader[i];
                        }
                        yield return dict;
                    }
                }
            }
        }
受保护的IEnumerable可执行程序(
字符串查询,
索引参数,
IEqualityComparer比较器=空)
{
使用(DbCommand=GetCommand())
{
command.CommandText=查询;
if(参数!=null)
{
foreach(参数中的var对)
{
DbParameter=command.CreateParameter();
parameter.ParameterName=string.IsNullOrEmpty(ParameterPrefix)
?配对钥匙
:ParameterPrefix+pair.Key;
parameter.Value=pair.Value==null?DBNull.Value:pair.Value;
command.Parameters.Add(参数);
}
}
使用(DbDataReader=command.ExecuteReader())
{
while(reader.Read())
{
var dict=比较器==null
?新字典(reader.FieldCount)
:新字典(reader.FieldCount、comparer);
对于(int i=0;i
代码通常由许多不同的.cs文件组成,因此我不确定哪一部分最适合发布,但这里是在其他地方调用的函数,用于执行查询。我认为这可能是最合适的开始


数据库命令是用“using”语法调用的,从理论上讲,它应该处理处理问题,我认为…

对于超时的查询,基本上有两种解决方案

首先,您必须确保设置了超时,以便只有在出现实际错误时才会触发超时,错误严重到您希望放弃查询而不是等待一小会儿。例如,如果查询通常需要5秒钟,您可能希望超时时间接近30秒。如果它们通常需要30秒,您可能需要2分钟或更长的超时时间

其次,您必须确保查询在尽可能短的时间内完成


这并不是一个通用的答案,但是对于如何使查询运行得更快有很多建议。如果这是一个相对较新的应用程序,那么很可能很少考虑适当的索引。但是,每个查询的最佳方法可能有所不同。

能否提供您正在使用的部分代码?出现超时的原因有很多,有时影响我们的原因是服务器接收大量连接和/或正在执行复杂任务。SQL只是结构化查询语言—一种语言,而不是数据库产品。为了帮助诊断连接问题,我们确实需要知道您使用的是什么具体的数据库系统(以及哪个版本)(请相应地更新标记)…我猜是SQL Server,因为链接的问题指的是SQL Server。超时是发生在连接时还是执行命令时?通常是在执行命令时感谢您的输入。我不确定查询本身的结构是否是问题所在,因为超时是如此随机。超时时间目前设置为30秒,当我在SSM中测试查询本身时,平均需要1-2秒,最多10秒。