.NETデータプロバイダ - どのように私は、彼らが何ができるかを判断しますか?
-
19-09-2019 - |
質問
私はトランザクションをサポートしていない、またはネストされたトランザクションをサポートしていないプロバイダを使用して実行することができ、コードを持っています。
どのように私はプログラム的なサポートを決定するのでしょうか?
例えば。以下のコードは、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();
}
解決
の機能は、それらが提供するかについての詳細を与えるために、ADO.NETプロバイダのための組み込みの方法はありません。 SQLiteは(セーブポイントのための適切なサポートなし)のいずれかのネストされたトランザクションをサポートしていますが、SQLiteのためのいくつかのADO.NETプロバイダは、コード内でそれ偽物だろうしないように使用します。その場合、あなたはエラーが出ることがなかったが、あなたは、あなたが期待される動作を取得しない場合があります。
私はまたのIDataReaderインデクサーの多くの異なる実装を見てきました。それは存在しなかったフィールド名を渡されたときに、いくつかのプロバイダが例外をスローすることを可能するために使用され、一部のプロバイダは、nullを返します。 ADO.NET 2.0のヘルプドキュメントは、プロバイダが例外をスローする必要があることを示すために更新されましたが、チェック例外なく、すべてのプロバイダが正しく更新されたことを確認する方法はありません。
だから、要するに、System.Data.Common名前空間とさまざまなADO.NETプロバイダは、異なるデータベースを操作することが非常に簡単に行うことができますが、あなたが使っているものをDB(複数可)を認識する必要がありますし、各プロバイダの違い(大きな違いとは対照的に、おそらく迷惑な癖を文書化されますほとんどが)。