SqlCommand.ExecuteNonQuery() 是否在错误前插入前一行?
Does SqlCommand.ExecuteNonQuery() insert previous rows before an error?
我在 sql 服务器中创建了一个临时 table。我有 sql 命令对象的 commandText 从临时 table 插入到另一个 table。我的问题是:它是否在到达错误行之前插入行?
例如,假设 temptable 中有 1000 行,tableA 中有 0 行。我从 temptable 插入到 tableA。第999行有错误,抛出异常。 tableA里面有989行吗?还是0?
我试过用谷歌搜索这个问题,但我什么也没找到。我还阅读了 SQLCommand.ExecuteNonQuery() 上的文档,但没有找到答案。我将不胜感激任何帮助或线索。
既然你的INSERT
是单条语句,那就不行。 tableA 中将有 0 行。
如果您在一个批处理中有多个语句,那么每个成功执行的语句都将执行请求的修改,但出错的语句除外,这将使表保持前一个批处理完成时的状态。
如果您将上面提到的多语句批处理包装在 TRANSACTION
中,那么,一般来说,如果其中一个语句出错,您可以将整个批处理回滚到任何语句执行之前的状态.
注意:同样,这是一般情况。有许多外部因素会使您的数据处于不一致状态(服务器故障、IO 损坏等),在这种情况下 SQL 服务器将尝试从事务日志中回滚您的数据。
这是一条语句
INSERT tableA (col1,col2,col3)
SELECT col1,col2,col3
FROM #tmpTable;
此处的错误(例如数据类型不匹配、NOT NULL
列上的 NULL
值等)将导致 0 行被插入到表 A 中。
我在 sql 服务器中创建了一个临时 table。我有 sql 命令对象的 commandText 从临时 table 插入到另一个 table。我的问题是:它是否在到达错误行之前插入行?
例如,假设 temptable 中有 1000 行,tableA 中有 0 行。我从 temptable 插入到 tableA。第999行有错误,抛出异常。 tableA里面有989行吗?还是0?
我试过用谷歌搜索这个问题,但我什么也没找到。我还阅读了 SQLCommand.ExecuteNonQuery() 上的文档,但没有找到答案。我将不胜感激任何帮助或线索。
既然你的INSERT
是单条语句,那就不行。 tableA 中将有 0 行。
如果您在一个批处理中有多个语句,那么每个成功执行的语句都将执行请求的修改,但出错的语句除外,这将使表保持前一个批处理完成时的状态。
如果您将上面提到的多语句批处理包装在 TRANSACTION
中,那么,一般来说,如果其中一个语句出错,您可以将整个批处理回滚到任何语句执行之前的状态.
注意:同样,这是一般情况。有许多外部因素会使您的数据处于不一致状态(服务器故障、IO 损坏等),在这种情况下 SQL 服务器将尝试从事务日志中回滚您的数据。
这是一条语句
INSERT tableA (col1,col2,col3)
SELECT col1,col2,col3
FROM #tmpTable;
此处的错误(例如数据类型不匹配、NOT NULL
列上的 NULL
值等)将导致 0 行被插入到表 A 中。