【问题标题】:Is SqlCommand in correct state after it's fail?SqlCommand 失败后是否处于正确状态?
【发布时间】:2017-04-06 12:50:28
【问题描述】:

我想创建部分有序并行SqlCommand 队列,但我不确定一件事。

我需要考虑SqlCommand失败的情况,需要重新执行。

考虑以下代码:

SqlCommand myCommand = new SqlCommand();
myCommand.Parameters.AddWithValue("adsf", someVal);
myCommand.CommandType = CommandType.StoredProcedure;
while(myCommand.ExecuteNonQuery() <= 0) {
    log fail;
    wait some time;
}

SqlCommand 在正确的状态所有尝试?或者我应该总是创建新的SqlCommand 并用相同的参数填充它?

【问题讨论】:

  • 如果您要传递的参数没有任何变化并且sql连接也仍然打开,您可以重新执行ExecuteNonQuery方法。
  • 命令对象的状态会很好。数据库状态,不一定如此。
  • 您介意描述一下partially ordered parallel SqlCommand queue吗?
  • 只有当语句类型为select或发生回滚时,ExecuteNonQuery的返回值为-1。所以while(myCommand.ExecuteNonQuery() &lt;= 0) 没有检查SqlCommand 是否失败。在此处阅读更多信息stackoverflow.com/a/38060528/2946329
  • 这会产生无限循环,您至少应该添加一个计数器。您应该检查@RETURN_VALUE 而不是ExecuteNonQuery() 的结果。

标签: c# sql sqlcommand


【解决方案1】:

根据 MSDN

对于 UPDATE、INSERT 和 DELETE 语句,返回值为 受命令影响的行数。当触发器存在于 正在插入或更新的表,返回值包括数字 受插入或更新操作和数量影响的行数 受触发器或触发器影响的行数。对于所有其他类型的 语句,返回值为-1。如果发生回滚,则返回 值也是-1。

总而言之,如果您的所有行都不受存储过程的影响,那么您将返回值 0

如果您的存储过程中有SET NOCOUNT ON 或发生回滚,您将始终得到返回值-1

如果您想查看是否发生了错误,您需要在您的方法中放置一个 try catch。显然,我在这里遇到了一个通用异常。您可能希望捕获特定异常并将连接的打开和关闭包装在 using 语句中,以便在发生故障时处理连接。

int retryCount = 0;
        using (SqlCommand myCommand = new SqlCommand("MyStoredProcedure", new SqlConnection("Server=.;Database=MyDatabase;Trusted_Connection=True;")))
        {
            while (retryCount < 10)
            {
                try
                {
                    if (myCommand.Connection.State == ConnectionState.Closed)
                    {
                        myCommand.Connection.Open();
                    }

                    myCommand.CommandType = CommandType.StoredProcedure;
                    myCommand.ExecuteNonQuery();

                }
                catch (Exception ex)
                {
                    retryCount++;
                    System.Threading.Thread.Sleep(1000);
                }
            }
        }

【讨论】:

  • 但是在这里,您每次迭代都会创建新的 SqlCommand 实例。
  • 我已经编辑了答案。 SQL 命令将被创建一次。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-17
  • 1970-01-01
相关资源
最近更新 更多