我有一个方法可以达到2种方法。一个处理插入,另一个处理更新。我在这两种方法中设置了一个事务范围,所以如果有任何问题,它会回滚。我注意到它正在将数据放入数据库中,但是在出错时它并没有删除它。我已经尝试了范围的RequiresNew和必需选项,但这似乎没有什么区别。
其他信息: 这些存储过程实际上存储在“实用程序”数据库中,该数据库保存存储过程但实际上是在不同数据库中修改记录。
此方法会将大约700条记录插入40个不同的表中。
主要方法
using (var scope = new TransactionScope(TransactionScopeOption.Required))
{
foreach (var change in changes)
{
switch (change.ChangeType)
{
case ChangeTypeEnum.Insert:
var result = DataAccess.InsertTableRow(sourceEnvironmentId, SuperClientVendorID,
DatabaseName, DataRouteName, change,
typeNamespace);
postList.Add(result);
break;
case ChangeTypeEnum.Update:
DataAccess.UpdateTableRow(sourceEnvironmentId, SuperClientVendorID, DatabaseName,
DataRouteName, change, typeNamespace);
postList.Add(change);
break;
}
}
scope.Complete();
}
插入方法
var sproc = string.Format("Carma.usp_{0}_{1}_ins", databaseName, managedState.TypeName);
var connString = DataAccessManager.GetConnectionString(executionEnvironment, superClientVendorID, routeName, sproc, false);
using (var newConnection = new SqlConnection(connString))
{
newConnection.Open();
using (var newSqlCommand = new SqlCommand(sproc, newConnection))
{
newSqlCommand.CommandType = CommandType.StoredProcedure;
newSqlCommand.CommandTimeout = Setup.TimeOut;
newSqlCommand.Parameters.AddRange(GetParameters(managedState, typeNamespace, true));
newSqlCommand.ExecuteNonQuery();
return managedState;
}
}
答案 0 :(得分:0)
所以一位同事能够帮我解决这个问题..这里有修改后的代码,希望能帮到那里的人:)
通话方式:
using (var scope = new TransactionScopeMS())
{
foreach (var change in changes)
{
switch (change.ChangeType)
{
case ChangeTypeEnum.Insert:
var result = DataAccess.InsertTableRow(sourceEnvironmentId, SuperClientVendorID,
DatabaseName, DataRouteName, change,
typeNamespace);
postList.Add(result);
break;
case ChangeTypeEnum.Update:
DataAccess.UpdateTableRow(sourceEnvironmentId, SuperClientVendorID, DatabaseName,
DataRouteName, change, typeNamespace);
postList.Add(change);
break;
}
}
scope.Complete();
}
插入方法:
using (IDbConnection newConnection = TransactionScopeMS.Current.GetConnection(connectionString))
{
using (IDbCommand newSqlCommand = newConnection.CreateCommand(sproc, CommandType.StoredProcedure, TransactionScopeMS.Current.GetTransaction(connectionString)))
{
foreach (var pram in GetParameters(managedState, typeNamespace, true))
{
newSqlCommand.Parameters.Add(pram);
}
newSqlCommand.ExecuteNonQuery();
return managedState;
}
}