C# 甲骨文和;通过ADO.NET访问SQL Server失败
我用C语言编写了一个类,旨在提供在给定数据库连接上运行数据库事务的能力。但是,当我尝试运行代码时,在Oracle和SQL Server上分别出现以下两个错误。看看我的代码,有没有简单的方法 Oracle 连接已经是本地或分布式事务的一部分 SQL Server 2008 SqlConnection不支持并行事务 基类C# 甲骨文和;通过ADO.NET访问SQL Server失败,c#,oracle,sql-server-2008,ado.net,transactions,C#,Oracle,Sql Server 2008,Ado.net,Transactions,我用C语言编写了一个类,旨在提供在给定数据库连接上运行数据库事务的能力。但是,当我尝试运行代码时,在Oracle和SQL Server上分别出现以下两个错误。看看我的代码,有没有简单的方法 Oracle 连接已经是本地或分布式事务的一部分 SQL Server 2008 SqlConnection不支持并行事务 基类 public abstract class DbFactoryDatabaseTransaction { public void DoTransaction(IDa
public abstract class DbFactoryDatabaseTransaction
{
public void DoTransaction(IDatabaseConnectivityObjectBasicResponse databaseConnectivityObject)
{
databaseConnectivityObject.PrepareConnection();
DbTransaction dbTransaction = databaseConnectivityObject.DBFactoryDatabaseConnection.BeginTransaction();
try
{
ExecuteSql(databaseConnectivityObject, dbTransaction);
dbTransaction.Commit();
}
catch (Exception ex)
{
dbTransaction.Rollback();
databaseConnectivityObject.Close();
throw;
}
finally
{
dbTransaction.Dispose();
}
}
/// <summary>
/// A method to allow the caller to decide how the SQL statements are called as part of a transaction
/// </summary>
public abstract void ExecuteSql(IDatabaseConnectivityObjectBasicResponse databaseConnectivityObject, DbTransaction dbTransaction);
}
试验方法
public override void ExecuteSql(IDatabaseConnectivityObjectBasicResponse databaseConnectivityObject, DbTransaction dbTransaction)
{
//oracle
List<string> transactions = new List<string>
{
"INSERT INTO TMA_NOT_TO_ENTITY_QUEUE (RECEIVED_NOTICE_ID, NOTICE_TEXT, STATE_ID, TIME_RECEIVED) VALUES (1, 'This is a notice', 1, to_date('2012/08/15', 'yyyy/mm/dd'))",
"INSERT INTO TMA_NOT_TO_ENTITY_QUEUE (RECEIVED_NOTICE_ID, NOTICE_TEXT, STATE_ID, TIME_RECEIVED) VALUES (2, 'This is a notice', 1, to_date('2012/08/15', 'yyyy/mm/dd'))",
"INSERT INTO TMA_NOT_TO_ENTITY_QUEUE (RECEIVED_NOTICE_ID, NOTICE_TEXT, STATE_ID, TIME_RECEIVED) VALUES (3, 'This is a notice', 1, to_date('2012/08/15', 'yyyy/mm/dd'))",
"INSERT INTO TMA_NOT_TO_ENTITY_QUEUE (RECEIVED_NOTICE_ID, NOTICE_TEXT, STATE_ID, TIME_RECEIVED) VALUES (4, 'This is a notice', 1, to_date('2012/08/15', 'yyyy/mm/dd'))",
"INSERT INTO TMA_NOT_TO_ENTITY_QUEUE (RECEIVED_NOTICE_ID, NOTICE_TEXT, STATE_ID, TIME_RECEIVED) VALUES (5, 'This is a notice', 1, to_date('2012/08/15', 'yyyy/mm/dd'))",
"INSERT INTO TMA_NOT_TO_ENTITY_QUEUE (RECEIVED_NOTICE_ID, NOTICE_TEXT, STATE_ID, TIME_RECEIVED) VALUES (6, 'This is a notice', 1, to_date('2012/08/15', 'yyyy/mm/dd'))"
};
databaseConnectivityObject.DBFactoryDatabaseCommand.Transaction = databaseConnectivityObject.DBFactoryDatabaseConnection.BeginTransaction();
foreach (var transaction in transactions)
{
databaseConnectivityObject.DBFactoryDatabaseCommand.CommandText = transaction;
databaseConnectivityObject.DBFactoryDatabaseCommand.CommandType = CommandType.Text;
databaseConnectivityObject.DBFactoryDatabaseCommand.Transaction = dbTransaction;
databaseConnectivityObject.DBFactoryDatabaseCommand.ExecuteNonQuery();
}
}
public void RunTransaction()
{
IDatabaseConnectivityObjectBasicResponse databaseConnectivityObject = new DbProviderFactoryConnectionBasic();
DoTransaction(databaseConnectivityObject);
}
[TestMethod()]
public void RunTransactionTest()
{
TmaNoticeToClusteredEntityValidation target = new TmaNoticeToClusteredEntityValidation(BindVariables, SqlFactory, Dialect);
target.RunTransaction();
Assert.Inconclusive("A method that does not return a value cannot be verified.");
}
事实证明,问题实际上是我对连接对象调用了两次BeginTransaction()。通过删除
databaseConnectivityObject.DBFactoryDatabaseCommand.Transaction=databaseConnectivityObject.DBFactoryDatabaseConnection.BeginTransaction()解决了此问题;
从override方法中删除。只需在override中省略这一行即可
databaseConnectivityObject.DBFactoryDatabaseCommand.Transaction = databaseConnectivityObject.DBFactoryDatabaseConnection.BeginTransaction();
改变这个
databaseConnectivityObject.DBFactoryDatabaseCommand.Transaction = dbTransaction;
到
databaseConnectivityObject.DBFactoryDatabaseCommand.Connection= databaseConnectivityObject.DBFactoryDatabaseConnection;