2017-02-11 311 views
1

我正在用C++写入SQL Server数据库。我有一个叫做SQLTransaction的对象,它在代码块的开头创建时,向SQL Server发送'begin transaction'。ROLLBACK TRANSACTION请求在SQL Server之后没有对应的BEGIN TRANSACTION错误8114

然后我发送一个或多个SQL语句到服务器。如果一切顺利,我在SQLTransaction对象中设置一个标志,让它知道这组命令进行得很顺利。当SQLTransaction对象超出范围时,它会根据标志的状态向服务器发送“提交事务”或“回滚事务”。

它看起来是这样的:

{ 
     TSQLTransaction SQLTran(); 

     try 
     { 
      Send(SomeSQLCommand); 
     } 
     catch(EMSError &e) 
     { 
      InformOperator(); 
      return; 
     } 

     SQLTran.commit(); 
    } 

我发送一个指挥不力,这些方框的一个有一个SQL语句和命令扔了SQL错误8114

错误转换数据类型varchar数字

我已经修复了这个问题。我不明白的事实是,我还收到第二个SQL错误消息

ROLLBACK TRANSACTION请求没有对应的BEGIN TRANSACTION。

我找不到任何告诉我这个事务可以或不应该在故障后回滚的东西。

这个完全相同的SQLTransaction对象在我的应用程序的许多地方使用,似乎总是工作正常,直到现在。出于某种原因,这个SQL错误似乎被区别对待。是否有一些SQL Server自动回滚的错误?我真的很想了解这里发生了什么。

感谢

+0

为什么你不能把事务逻辑放在SQL语句中? –

回答

0

有一个连接选项,SET XACT_ABORT,决定当前事务(S)时的SQL语句抛出一个错误的命运。基本上,当设置为OFF时,事务(通常)存活并继续执行;如果是ON,则当前连接中所有打开的事务都将回滚并终止批处理。

选项可以设置:

  1. 在连接层;
  2. 不同的数据库访问驱动程序可能有不同的连接选项默认值;
  3. 在SQL Server实例级别上有一个默认值。

检查最近是否有这些变化。另外,如果您在SQL事件探查器中捕获跟踪,“ExistingConnection”事件列出当前的连接设置。你可以随时检查那里的选项状态,并在关闭时排除它。在这种情况下,我会仔细观察跟踪,可能会有其他命令发送到服务器,这些命令在您的客户端代码中并不明显。