为什么“插入(...)值(...)”不能插入新行?

时间:2010-06-07 10:12:40

标签: sql sql-server delphi ado

我有一个简单的SQL插入语句形式:

insert into MyTable (...) values (...)

重复使用它来插入行,通常按预期工作。它只向MyTable插入一行,这也是Delphi语句AffectedRows:= myInsertADOQuery.ExecSQL返回的值。

一段时间后出现了临时网络连接问题。因此,同一应用程序的其他线程感知到EOleExceptions(连接失败,-2147467259 =未指定错误)。之后,网络连接重新建立,这些线程重新连接并且没问题。

但是,负责执行上述插入语句的线程没有察觉到连接问题(没有例外) - 可能只是在网络关闭时没有执行。但是在网络连接问题之后,myInsertADOQuery.ExecSQL总是返回0,并且不再向MyTable插入任何行。重新启动应用程序后,insert语句按预期再次运行。

对于SQL Server,是否存在任何定义的情况,其中像上面那样的插入语句不会插入行并返回0作为受影响行的数量?主键是自动生成的GUID。没有唯一或检查约束(无论如何都应该导致异常而不是插入行)。

是否有任何已知的ADO错误(Provider = SQLOLEDB.1)?

对此行为有何其他解释?

谢谢, 喃

4 个答案:

答案 0 :(得分:2)

如果您没有任何例外,那么:

  1. 当一个表有没有SET NOCOUNT ON的触发器时,实际上操作(INSERT / UPDATE / DELETE)可能会成功完成,但是许多受影响的记录可能会返回0。
  2. 根据当前会话中的事务活动,其他会话可能看不到当前会话所做的更改。但是当前会话将看到自己的变化,并且许多受影响的记录将(可能)不是0。
  3. 因此,确切的答案可能取决于您的表DDL(如果有的话会触发+)以及您如何检查插入的行。

答案 1 :(得分:2)

看起来你的插入线程静默地丢失了连接,并且没有检查它是否在需要时进行自动重新连接,但是在没有实际发送它们的情况下继续对插入进行排队。
我会在一个小型独立应用程序中隔离此代码以对其进行调试,并查看当您自愿断开网络然后重新连接时它的行为。
如果您发现“吞噬”异常,或者某些代码忽略检查成功/失败,我不会感到惊讶。
希望它有所帮助...

答案 2 :(得分:1)

如果您尝试插入的值违反了

  • 一个CHECK约束
  • 外键关系
  • 一个NOT NULL约束
  • 一个UNIQUE约束

或任何其他约束,则不会插入行。

答案 3 :(得分:1)

您使用交易吗?也许你的申请没有autocommit?如果事务中存在错误,某些驱动程序不会提交数据。