C# 增加SQL命令的命令超时

C# 增加SQL命令的命令超时,c#,sql,ado.net,connection-timeout,C#,Sql,Ado.net,Connection Timeout,我有点小问题,希望有人能给我一些建议。我正在运行一个SQL命令,但是由于有大量数据,该命令似乎需要大约2分钟才能返回数据。但是默认的连接时间是30秒,我如何增加它,并将其应用于这个命令 public static DataTable runtotals(string AssetNumberV, string AssetNumber1V) { DataTable dtGetruntotals; try { dtGetruntotals = new Data

我有点小问题,希望有人能给我一些建议。我正在运行一个SQL命令,但是由于有大量数据,该命令似乎需要大约2分钟才能返回数据。但是默认的连接时间是30秒,我如何增加它,并将其应用于这个命令

public static DataTable runtotals(string AssetNumberV, string AssetNumber1V)
{
    DataTable dtGetruntotals;

    try
    {
        dtGetruntotals = new DataTable("Getruntotals");

        //SqlParameter AssetNumber = new SqlParameter("@AssetNumber", SqlDbType.VarChar, 6);
        //AssetNumber.Value = AssetNumberV; 

        SqlParameter AssetNumber = new SqlParameter("@AssetNumber", SqlDbType.VarChar, 10);
        AssetNumber.Value = AssetNumberV;

        SqlParameter AssetNumber1 = new SqlParameter("@AssetNumber1", SqlDbType.VarChar, 10);
        AssetNumber1.Value = AssetNumber1V;

        SqlCommand scGetruntotals = new SqlCommand("EXEC spRunTotals @AssetNumber,@AssetNumber1 ", DataAccess.AssetConnection); 
        // scGetruntotals.Parameters.Add(AssetNumber);
        scGetruntotals.Parameters.Add(AssetNumber);
        scGetruntotals.Parameters.Add(AssetNumber1);

        SqlDataAdapter sdaGetruntotals = new SqlDataAdapter();
        sdaGetruntotals.SelectCommand = scGetruntotals;
        sdaGetruntotals.Fill(dtGetruntotals);

        return dtGetruntotals;
    }
    catch (Exception ex)
    {
        MessageBox.Show("Error Retriving totals Details: Processed with this error:" + ex.Message);
        return null;
    }
}

添加
SqlCommand
的超时。请注意时间是秒

// Setting command timeout to 1 second
scGetruntotals.CommandTimeout = 1;
由于数据量很大,因此该命令大约需要2分钟才能返回数据

可能是因为设计不好。考虑在这里使用分页。 默认连接时间为30秒,如何增加

由于命令面临超时,因此需要增加命令的超时时间。您可以像这样在命令中指定它

// Setting command timeout to 2 minutes
scGetruntotals.CommandTimeout = 120;

由于响应需要2分钟,您可以通过添加以下代码将超时时间增加到3分钟

scGetruntotals.CommandTimeout = 180;

注意:参数值以秒为单位。

不建议将CommandTimeout设置为120。尝试使用上面提到的分页。将CommandTimeout设置为30视为正常。任何比这更糟糕的方法,这通常会导致一些错误的实施。现在世界正在以毫秒的速度运行。

将命令超时设置为2分钟

 scGetruntotals.CommandTimeout = 120;
但是,您可以优化存储过程以减少时间! 像

  • 移除马槽或while等
  • 使用分页
  • 使用#tentable和@variableTable
  • 优化联接表

考虑将超时值也添加到配置文件中,否则任何调整都意味着代码重新部署。不客气,您可以接受它。尽管我会认真地克制自己不使用一个需要2分钟的查询。尝试使用分页。@ManishKumarSingh谁会等待10分钟,等待查询返回结果?这是一个毫秒的时代。@Ehsan当你或一小队人是唯一使用该软件的人时,查询一年只运行几次。在这些情况下,通常不值得优化。(不过,在编写后端公司软件时,一些精心设计的索引可以保护您的理智。)@Ehsan我不同意。。。。。我有一个类似的情况,它在生产环境中正常运行(几秒钟),但在一个测试服务器上运行,该服务器在30秒内被剥离并由多个资源共享。在这种情况下,延长超时时间没有什么错。糟糕的设计?不总是这样。在以前的一个工作场所,当我们不得不对生产进行维护时,我们转而使用备份数据库。在此期间,即使在恢复到备份服务器时保留了统计数据,我们也会超时。当某些查询运行时间较长时,它们有时会生成不同的执行计划,因此我们在DR/backup服务器上延长了配置中的超时时间,尽管它们与生产服务器基本相同。不能保证您会有相同的执行计划。我们在恢复后尝试了完全扫描,但没有成功。将超时时间增加到10分钟或30分钟有任何缺点吗?Manish,您希望等待10分钟或30分钟,以便进程获取数据吗?如果这是一个一夜之间的过程,而且是唯一的事情,不会影响其他任何地方,30分钟为什么不呢。或者,如果你不是在等待结果,为什么不呢?这是一个很好的观点,但有时分页是不可能的。例如CSV导出或类似的文件下载。只是错误:“将CuthdTimeOutt设置为30被认为是正常的。@MertAkcakaya-我可以知道为什么吗?@PranavKulshrestha没有普遍的意见或有效的理由说将命令超时设置为30以上是不好的做法。我们有很多需要30秒以上才能执行的存储过程。@MertAkcakaya这是真的。没有此类技术文件。我根据我们遵循的一般标准进行了评论。谢谢