.NET数据提供者 - 我如何确定他们可以做什么?

时间:2010-01-06 22:55:41

标签: .net transactions dataprovider nested-transactions

我的代码可以使用不支持事务的Provider执行,或者不支持嵌套事务。

我如何以编程方式确定此类支持?

E.g。使用MySQL .NET Connector时,下面的代码在最终提交时抛出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();
}

1 个答案:

答案 0 :(得分:1)

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

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

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