1

我有可以使用不支持事务或不支持嵌套事务的提供程序执行的代码。

我将如何以编程方式确定这种支持?

例如,下面的代码在使用 MySQL .NET 连接器时在最终提交时抛出 System.InvalidOperationException,但对于 MSSQL 工作正常。

我希望能够更改代码以适应各种提供者,而不必根据提供者的类型对测试进行硬编码(例如,我不想这样做if(typeof(connection) == "some provider name")

using (IDbConnection connection = Use.Connection(ConnectionStringName))
using (IDbTransaction transaction = connection.BeginTransaction())
{
  using (currentCommand = connection.CreateCommand())
  {
    using (IDbCommand cmd = connection.CreateCommand())
    {
      currentCommand = cmd;
      currentCommand.Transaction = transaction;
      currentCommand.ExecuteNonQuery();
    }

    if (PipelineExecuter.HasErrors)
    {
      transaction.Rollback();
    }
    else
    {
      transaction.Commit();
    }
  }

  transaction.Commit();
}
4

1 回答 1

1

ADO.NET 提供程序没有内置方式来提供有关它们提供的功能的详细信息。SQLite 过去也不支持嵌套事务,但是一些 SQLite 的 ADO.NET 提供程序会在代码中伪造它(没有对保存点的适当支持)。在这种情况下,您永远不会遇到错误,但您可能无法获得预期的行为。

我还看到了 IDataReader 索引器的许多不同实现。过去有些提供者在传递一个不存在的字段名时会抛出异常,有些提供者会返回 null。在 ADO.NET 2.0 中,帮助文档已更新以指示提供程序应引发异常,但如果没有检查异常,则无法确保所有提供程序都已正确更新。

因此,简而言之,System.Data.Common 命名空间和各种 ADO.NET 提供程序使使用不同的数据库变得更加容易,但您必须了解您正在使用的数据库以及它们的区别每个提供者(其中大部分可能是无证的烦人的怪癖,而不是大的差异)。

于 2010-01-28T03:28:41.653 回答