C# 我的服务器因存储过程中的异常而挂起。超时已过期
我在存储过程中编写了一个游标,基本上如下所示:C# 我的服务器因存储过程中的异常而挂起。超时已过期,c#,.net,sql-server,sql-server-2008,C#,.net,Sql Server,Sql Server 2008,我在存储过程中编写了一个游标,基本上如下所示: OPEN curr Fetch NEXT FROM curr into @ID, @IsCC, @JurisdictionID While @@FETCH_STATUS = 0 Begin --Code for Update and Insert operations Fetch NEXT FROM curr into @ID, @IsCC, @JurisdictionID En
OPEN curr
Fetch NEXT FROM curr into @ID, @IsCC, @JurisdictionID
While @@FETCH_STATUS = 0
Begin
--Code for Update and Insert operations
Fetch NEXT FROM curr into @ID, @IsCC, @JurisdictionID
End
CLOSE curr
DEALLOCATE curr
现在在While循环中,我得到了一个外键冲突的Insert语句的异常。所以我修复了它,但在这个异常之后,当我尝试运行我的应用程序时,它甚至不能运行最简单的查询,并且我一直得到超时过期的消息。只有在我重新启动我的Sql Server服务之后,一切似乎都正常启动了
我的猜测是,在我命中异常后,CLOSE and DEALLOCATE语句没有运行。如果发生这种情况,我该怎么办?我很害怕,如果在生产中发生这种情况,我会像一块土豆一样被砸碎。我不确定,你的代码看起来怎么样,但通常情况下,如果人们有一个糟糕的异常处理,并且与数据库的连接仍然存在,他们就会出现这种行为
如果这两个命令未运行,则应仅从此代码中获取以下异常:
通过创建:
名为“curr”的游标已存在
开幕式前:
光标已打开
我认为您应该使数据库级别的异常处理更加安全。我不确定您的代码看起来如何,但通常情况下,如果人们的异常处理不好,并且与数据库的连接仍然存在,他们就会出现这种行为
如果这两个命令未运行,则应仅从此代码中获取以下异常:
通过创建:
名为“curr”的游标已存在
开幕式前:
光标已打开
我认为您应该使数据库级别的异常处理更加安全。@David:但我为什么要在存储过程中处理try-catch呢?我已经用我的C代码处理过了。此外,即使引发异常,SQL server也不会继续执行代码吗?T-SQL不像C代码,我想当你遇到异常时,下一行代码不会执行。我猜执行了下一行SQL,但设置了@Error全局变量?如果我错了,请纠正我。为什么更新和插入操作需要游标?能否重写语句以避免游标?您是否更新/插入了大量记录?您使用哪些数据访问组件?如果是ADO.NET
,则SqlCommand
的默认值为30秒。你可以增加它,但这并不能解决根本问题。还要检查锁。marc#s:因为我正在进行批量操作,并且我在存储过程中传递了用户定义的类型(来自C#的DataTable),还有其他复杂的操作在进行。@David:但我为什么要在存储过程中处理try-catch?我已经用我的C代码处理过了。此外,即使引发异常,SQL server也不会继续执行代码吗?T-SQL不像C代码,我想当你遇到异常时,下一行代码不会执行。我猜执行了下一行SQL,但设置了@Error全局变量?如果我错了,请纠正我。为什么更新和插入操作需要游标?能否重写语句以避免游标?您是否更新/插入了大量记录?您使用哪些数据访问组件?如果是ADO.NET
,则SqlCommand
的默认值为30秒。你可以增加它,但这并不能解决根本问题。还要检查锁。marc#s:因为我正在进行批量操作,我在存储过程中传递了我的用户定义类型(C#中的DataTable),还有其他复杂的操作正在进行。