Command.ExecuteNonQuery()挂断了

时间:2014-08-07 17:56:45

标签: c# sql-server-2008

当我调试存储过程时,它可以工作,但我的C#代码在执行相同的存储过程时挂起Command.ExecuteNonQuery();

当它卡住时我也无法在各个表上使用select命令。

你能不能帮助我,为什么Command.ExecuteNonQuery();挂断了。

以下是一些代码段

 using (command = manager.CreateStoredProcCommandWrapper(
            "UpdatePayrollStagingWithTaxYearID",
            new Object[] { HttpContext.Current.Session.SessionID, taxyearID }))
            {
                manager.ExecuteNonQuery(command);
            }


          public void ExecuteNonQuery(NTTGDBCommandWrapper commandWrapper)
        {
            NTTGArgumentValidation.CheckForNullReference(commandWrapper, "commandWrapper");
            Stack trans = GetTransactions();
            if (trans.Count > 0)
            {
                GetDatabase().ExecuteNonQuery(commandWrapper.InnerCommand, (IDbTransaction)trans.Peek());
            }
            else
            {
                GetDatabase().ExecuteNonQuery(commandWrapper.InnerCommand);
            }
        }

        protected Stack GetTransactions()
        {
            Stack transactionStack = (Stack)CallContext.GetData(this._contextIdentifierForTransactions);
            if (transactionStack == null)
            {
                transactionStack = new Stack();
                CallContext.SetData(this._contextIdentifierForTransactions, transactionStack);
            }

            return (transactionStack);
        }

        public virtual void ExecuteNonQuery(DBCommandWrapper command, IDbTransaction transaction)
        {
            PrepareCommand(command, transaction);
            DoExecuteNonQuery(command);
        }

         private void DoExecuteNonQuery(DBCommandWrapper command)
        {
            try
            {
                DateTime startTime = DateTime.Now;
                command.RowsAffected = command.Command.ExecuteNonQuery();
                this.instrumentation.CommandExecuted(startTime);
            }
            catch
            {
                this.instrumentation.CommandFailed(command.Command.CommandText, ConnectionStringNoCredentials);
                throw;
            }
        }

2 个答案:

答案 0 :(得分:3)

看起来您正在使用交易。

在您的DoExecuteNonQuery()方法中,当您的sql成功或失败时,它看起来不像是在调用IDbTransaction.Commit()IDbTransaction.Rollback()。不执行此操作将导致SQL Server保持任何锁定,直到事务以某种方式关闭,并且肯定会导致ExecuteNonQuery()挂起。

答案 1 :(得分:2)

您省略了调试此内容时需要了解的最重要部分。但是,你确实留下了一个重要的线索:

  

当它卡住时我也无法在各个表上使用select命令。

这告诉我查询正在运行,而且只需要太长时间。这至少可以让我提出一些建议:

  1. 如果您正在使用参数化查询(并且您应该使用),则可能存在Sql Server根据第一组参数值缓存次优执行计划的情况。请在OPTION RECOMPILE and sp_updatestats上阅读此问题以帮助解决此问题。
  2. 如果您正在使用参数化查询并使用AddWithValue()函数,最终可能会导致.Net从您的参数中推断出错误的数据库类型,因此Sql Server必须进行每行转换并且不能使用好的索引。 Instead, use the Add() overload that expects a specific database type.
  3. 如果您不使用查询参数,则需要启动。除了安全问题(并且它们非常重要)之外,查询参数更好,因为它们允许Sql Server更好地缓存查询计划,并且(上面的问题除外)产生更好的执行计划,从而加快查询速度。