我有可能使用一个供应商,不支持事务,或者不支持嵌套事务被执行的代码。

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

E.g。下面的代码引发对最终一个System.InvalidOperationException使用MySQL .NET连接器时提交,但对于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();
}
有帮助吗?

解决方案

有是一个ADO.NET提供商提供有关什么样的能力,他们提供的信息没有内置的方式。 SQLite的使用不支持嵌套事务,但有的ADO.NET提供者SQLite的将假的代码(不用于保存点适当的支持)。在这种情况下,你永远也得不到的错误,但你可能无法得到你所期望的行为。

我还看到的IDataReader索引的许多不同的实现。它曾经是,当通过了并不存在的字段名称一些供应商将抛出一个异常,而一些供应商将返回null。在ADO.NET 2.0的帮助文档进行了更新,以表明供应商应抛出异常,但没有检查的异常没有办法,以确保所有供应商进行适当的更新。

因此,总之,System.Data.Common命名空间和各种ADO.NET提供让人们更方便与不同的数据库,但你必须要知道DB()你正在使用的和在每个提供者的差异(其中大部分可能会被无证恼人的怪异而不是很大的差异)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top