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プロバイダーを使用すると、さまざまなデータベースでの作業がはるかに簡単になりますが、使用しているDBとの違いに注意する必要があります。各プロバイダー(そのほとんどは、大きな違いではなく、文書化されていない厄介な癖になるでしょう)。

于 2010-01-28T03:28:41.653 に答える