2014-01-07 76 views
0

我有一些在事务中运行的SQL命令。我使用SqlBulkCopy和SqlCommand类来执行数据库中的更改。起初,我用原始数据填充一个表格(使用SqlBulkCopy),然后调用执行某种同步的存储过程(根据原始数据插入,删除,更新其他表中的数据)。C#SqlTransaction.Commit不会抛出异常

问题是,当我在事务中调用这样的操作并且存储过程失败时(例如外键等),它不会抛出异常,我不知道发生了任何错误。

这里是代码片段(由try/catch语句包围):

SqlBulkCopy sqlUserGroupBulkCopy = new SqlBulkCopy(connection, SqlBulkCopyOptions.Default, transaction); 
    sqlUserGroupBulkCopy.DestinationTableName = USERGROUP_SOURCE_DATA_TABLE; 

    foreach (DataColumn column in UserGroupDataTable.Columns) 
     sqlUserGroupBulkCopy.ColumnMappings.Add(new SqlBulkCopyColumnMapping(column.ColumnName, column.ColumnName)); 

    sqlUserGroupBulkCopy.WriteToServer(UserGroupDataTable); 

    SqlCommand synchronizeCommand = new SqlCommand(); 
    synchronizeCommand.CommandType = CommandType.StoredProcedure; 
    synchronizeCommand.CommandText = SYNCHRONIZATION_SP; 
    synchronizeCommand.Parameters.AddWithValue("SourceName", "XXX"); 
    synchronizeCommand.Parameters.AddWithValue("Local", true); 
    synchronizeCommand.Connection = connection; 
    synchronizeCommand.Transaction = transaction; 
    synchronizeCommand.ExecuteNonQuery(); 

    transaction.Commit(); 

感谢答案, 米雷克

PS:我的代码运行在.NET 3.5的IIS 7.x的容器。

+0

只有几点 - 第一,不应该有'@ SourceName'作为参数名称而不是'SourceName'例如?其次,ExecuteNonQuery不会抛出异常吗?这是FK违规或其他情况发生的地方,而不是在事务提交期间(至少使用默认的事务设置)。我只希望其他问题,例如崩溃的服务器等在提交事务时抛出异常。什么是您的事务隔离级别? – Luaan

+0

当事务内部的某些事务失败时,事务提交不应该失败(您可能已经解决了问题并想要提交)。 –

+0

发布同步SP的代码。问题可能在那里,而不是你的C#代码。此外,张贴所涉及的表格和关系的定义。 –

回答

0

行, 我已经重建项目,重新启动IIS和MS SQL Server,它开始正常工作。我对生产中的这个问题感到很不高兴和担心。

Mirek