分散トランザクションにエスカレートされない Enterprise Library Data Access Block を使用して、バッチ処理された一連の CRUD 操作を単一のトランザクションで処理するためのベスト プラクティスは何ですか?
完全なソースを編集:
public void BatchInsertEvents(IList<EventItem> events)
{
_dataAccessBase = new DataAccessBase("[dbo].[EventInsert]");
int count = 0;
try
{
using (var scope =
new TransactionScope(TransactionScopeOption.RequiresNew))
{
foreach (var eventItem in events)
{
_dataAccessBase.ClearParameters();
_dataAccessBase.AddInParameter("@time",
DbType.String, eventItem.Time);
...more params
_dataAccessBase.ExecuteNonQuery();
count++;
}
scope.Complete();
}
}
私の DataAccessBase は、データベース オブジェクトの単なるラッパー クラスです。
public class DataAccessBase
{
private readonly DbCommand _command;
private readonly Database _database;
public DataAccessBase(string storedProcName) : this(null, storedProcName)
{
}
public DataAccessBase(string connectionString, string storedProcName)
{
_database = string.IsNullOrEmpty(connectionString) ?
DatabaseFactory.CreateDatabase() :
DatabaseFactory.CreateDatabase(connectionString);
_command = _database.GetStoredProcCommand(storedProcName);
}
public void AddInParameter<T>(string parameterName,
DbType parameterType, T value)
{
_database.AddInParameter(_command,
parameterName, parameterType, value);
}
public void AddOutParameter<T>(string parameterName,
DbType parameterType, int parameterLength)
{
_database.AddOutParameter(_command,
parameterName, parameterType, parameterLength);
}
public void ClearParameters()
{
_command.Parameters.Clear();
}
public void ExecuteNonQuery()
{
_database.ExecuteNonQuery(_command);
}
}