我有一个简单的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)?
对此行为有何其他解释?
谢谢, 喃
答案 0 :(得分:2)
如果您没有任何例外,那么:
因此,确切的答案可能取决于您的表DDL(如果有的话会触发+)以及您如何检查插入的行。
答案 1 :(得分:2)
看起来你的插入线程静默地丢失了连接,并且没有检查它是否在需要时进行自动重新连接,但是在没有实际发送它们的情况下继续对插入进行排队。
我会在一个小型独立应用程序中隔离此代码以对其进行调试,并查看当您自愿断开网络然后重新连接时它的行为。
如果您发现“吞噬”异常,或者某些代码忽略检查成功/失败,我不会感到惊讶。
希望它有所帮助...
答案 2 :(得分:1)
如果您尝试插入的值违反了
或任何其他约束,则不会插入行。
答案 3 :(得分:1)
您使用交易吗?也许你的申请没有autocommit
?如果事务中存在错误,某些驱动程序不会提交数据。