当我调试存储过程时,它可以工作,但我的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;
}
}
答案 0 :(得分:3)
看起来您正在使用交易。
在您的DoExecuteNonQuery()
方法中,当您的sql成功或失败时,它看起来不像是在调用IDbTransaction.Commit()
或IDbTransaction.Rollback()
。不执行此操作将导致SQL Server保持任何锁定,直到事务以某种方式关闭,并且肯定会导致ExecuteNonQuery()
挂起。
答案 1 :(得分:2)
您省略了调试此内容时需要了解的最重要部分。但是,你确实留下了一个重要的线索:
当它卡住时我也无法在各个表上使用select命令。
这告诉我查询正在运行,而且只需要太长时间。这至少可以让我提出一些建议:
AddWithValue()
函数,最终可能会导致.Net从您的参数中推断出错误的数据库类型,因此Sql Server必须进行每行转换并且不能使用好的索引。 Instead, use the Add()
overload that expects a specific database type.