C#:通过 ADO.NET 在 SQL Server 2008 上运行事务
Posted
技术标签:
【中文标题】C#:通过 ADO.NET 在 SQL Server 2008 上运行事务【英文标题】:C#: Running a transaction on SQL Server 2008 via ADO.NET 【发布时间】:2012-08-15 14:30:55 【问题描述】:使用以下方法,我可以使用 ADO.NET 对 Oracle 数据库运行事务。当我在 SQL Server 数据库上尝试相同的代码时,我得到了显示的错误。这是什么原因造成的,如何解决?
错误:
ExecuteNonQuery 要求命令有一个事务,当 分配给命令的连接处于挂起的本地事务中。 该命令的 Transaction 属性尚未初始化。
守则:
/// <summary>
/// A method to run transactional SQL on a database. Does not return a record set.
/// </summary>
/// <param name="transactions">A list of commands</param>
/// <returns>A boolean indicator of success</returns>
public bool ExecuteTransactionNonQuery(List<string> transactions)
if (transactions == null)
throw new ArgumentNullException("transactions");
PrepareConnection();
DbTransaction dbTransaction = DBFactoryDatabaseConnection.BeginTransaction();
try
foreach (var transaction in transactions)
DBFactoryDatabaseCommand.CommandText = transaction;
DBFactoryDatabaseCommand.CommandType = CommandType.Text;
DBFactoryDatabaseCommand.ExecuteNonQuery();
dbTransaction.Commit();
catch(Exception ex)
dbTransaction.Rollback();
try
Close();
catch (Exception f)
throw new Exception("Error: Transaction execute failed on the database. " + ex.Message + ". Following that the application failed to close the connection. " + f.Message + ". ExecuteTransactionNonQuery().");
throw;
finally
dbTransaction.Dispose();
return true;
【问题讨论】:
将 Command.Transaction 属性设置为事务。 【参考方案1】:您需要将事务分配给命令。
DBFactoryDatabaseCommand.Transaction = dbTransaction;
【讨论】:
你能在我的代码中显示该行需要放在哪里吗?我假设在分配命令文本之后?每次执行时都必须这样做吗? 它需要在DBFactoryDatabaseCommand.ExecuteNonQuery()
之前。如果连接与事务相关联,那么是的,它每次都需要分配。以上是关于C#:通过 ADO.NET 在 SQL Server 2008 上运行事务的主要内容,如果未能解决你的问题,请参考以下文章
ADO .NET 与 SQL Server Management Studio - ADO 性能更差