【问题标题】:Parameters cause sql query to time out参数导致sql查询超时
【发布时间】:2009-11-05 17:05:53
【问题描述】:

我有一个很长的 SQL 查询,它会执行一些插入、更新和删除操作。每个查询使用相同的 2 个参数。如果我从 C# 将它们作为 SQL 参数传递,它会在 20 分钟后超时。我只是将参数放入命令文本中,它就可以工作。当我将它与参数一起使用时,它甚至不会出现在分析器中,直到它超时。我错过了什么吗?

SqlCommand comm = new SqlCommand(cmdText, conn); 
comm.CommandTimeout = 5 * 60; 
SqlParameter p = new SqlParameter("@key1", SqlDbType.Int);
p.Value = key1;
comm.Parameters.Add(p);
p = new SqlParameter("@key2", SqlDbType.Int);
p.Value = 1000000;
comm.Parameters.Add(p);
comm.ExecuteNonQuery();

如果您取出参数代码,并在执行查询之前替换 cmdText 即可。查询本身就是300行左右。每个参数被使用 51 次。

【问题讨论】:

  • 您可能想向我们展示您的 c# 代码
  • 发布一些来源。如果查询在超时之前未显示在分析器中,则表示它没有被提交。
  • 您应该检查您是否在分析器中只获得了 SQL Stmt Completed,或者您是否也获得了 SQL Stmt Started。
  • 您说您正在连续执行许多插入、更新、删除操作……命令准备有时会咬您一口。您是重复使用相同的命令对象还是每次都创建一个新的命令对象?如果您在执行一堆命令的命令中包含相同的 SQL,则可以节省时间来保留命令对象直到您完成。
  • 旁注:如果您使用的是 SQL Server 2008,请考虑使用 Merge 语句和表值参数。当基于批量客户端更改更新/插入/删除单个表的大量记录时,这可以清理您的代码。

标签: c# .net sql-server parameters


【解决方案1】:

您可能在 ExecuteNonQuery() 之前缺少 comm.Prepare() 调用。

关键在于 SQL 命令,而不是说“cmdText”发布你的 SQL 命令。

编辑:您也没有在代码中指定参数方向,这可能很重要。

【讨论】:

    【解决方案2】:

    你设置了命令类型吗?

    var command = new SqlCommand() { CommandType = CommandType.StoredProcedure };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多