2012-04-11 2 views
13

複数の可能なデータソースへの接続(データベースに依存しない)に関して、C#での上記の各データベース接続方法の主な利点は何ですか?また、全面的に最高のパフォーマンスを発揮する可能性のあるパフォーマンスに関しては、DbConnectionとOleDbConnectionとOdbcConnectionとの比較

最後に、データベースに依存しないアプリケーションの特定の方法を避ける理由はありますか?

私のアプリケーションは現在Oleを使用しており、工場を使用している特定のデータベースに接続する際のいくつかの問題があり、代替案が検討されているためです。私はOdbcがOleよりも遅いと聞いてきましたが、これの背後には何か真理がありますし、実際のアプリケーションでは本当に目立っていますか?私が言ったの事前知識なしに任意のデータベースに接続することのできる作業データアクセス層を持っている必要があります私の現在のプロジェクトの状態について

私の要件を次のようにこのテーマで私の興味のため

理由は、データベース。したがって、私は任意のデータベースに固有のものを接続の点でハードコードすることはできません。指定された各データベースでの方言固有のステートメントの実行は、SQLクエリファクトリタイプの概念を使用して処理されています。同じことが、バインド変数の置換と書式設定にも適用されます。

UPDATE:これは、ADO.netとデータベースプロバイダファクトリを使用しているコードの作業バージョンです。これは、Adam Houldsworthの提案した基本クラスを使用していることを意味します。プロバイダはproviderName属性の接続文字列で指定されます。接続文字列は、データベース接続クラスで取得できるapp.configに格納されます。 Oracle用のnpgsqlやodacパッケージなどの正しいドライバがインストールされていれば、工場は正常に動作します。以下は、プロバイダ・ファクトリを使用した接続オブジェクトの基本コンストラクタを示すコードのサンプルです。

private readonly DbFactoryBindVariables m_bindVariables; 
private readonly DbProviderFactory m_provider; 
private string m_connectionString = String.Empty; 
private readonly string m_providerName = String.Empty; 
private DbConnection m_dbFactoryDatabaseConnection; 


/// <summary> 
/// Default constructor for DbFactoryDatabaseConnection. 
/// </summary> 
public DbProviderFactoryConnection() 
{ 
     m_providerName = ConfigurationManager.ConnectionStrings["ApplicationDefault"].ProviderName; 
     m_provider = DbProviderFactories.GetFactory(m_providerName); 

     m_dbFactoryDatabaseConnection = m_provider.CreateConnection(); 

     m_connectionString = ConfigurationManager.ConnectionStrings["ApplicationDefault"].ConnectionString; 
     m_dbFactoryDatabaseConnection.ConnectionString = m_connectionString; 

     m_bindVariables = new DbFactoryBindVariables(m_dialect.ToLower(), DbFactoryBindSyntaxLoader.Load(this)); 
} 

あなたの選択した.NET Frameworkのバージョン用のmachine.config内に既に存在しない場合、app.configファイルまたはweb.configファイルに次のような何かを追加する必要があります。

<system.data> 
    <DbProviderFactories> 
     <add name="Npgsql Data Provider" 
     invariant="Npgsql" 
     support="FF" 
     description=".Net Framework Data Provider for Postgresql Server" 
     type="Npgsql.NpgsqlFactory, Npgsql, Version=2.0.1.0, Culture=neutral, 
     PublicKeyToken=5d8b90d52f46fda7" /> 
    </DbProviderFactories> 
</system.data> 

必要な接続文字列:この段階で

<add name="ApplicationDefault" connectionString="DATA SOURCE=TNSNAME;PASSWORD=PASS;USER ID=USER;" providerName="Oracle.DataAccess.Client;"/> 

私は今、不可知論者は、アプリケーションのクライアントのバージョンを設定するときに正しい接続文字列が使用されて完全にデータベースすることができます。

+0

興味のある方のためのアップデートを追加しました。 – CSharpened

答えて

5

私はデータベースとの接続を抽象化しないでください。なぜなら、常に最小公約数をターゲットにしているからです。代わりに、エンティティの保存要件を抽象化しようとします。その抽象化の各実装は、データベース固有(基本的には、インタフェースに対してプログラミング)になります。

つまり、私は、複数のデータベースをサポートする必要性が厳しい要求を経験したことはありませんでした。この場合、このすべての悪化はYAGNIマントラに入ります。

ODBCにOLE DBを比較する上での質問は、一般的にここで見つけることができます:

what is the difference between OLE DB and ODBC data sources?

先行パフォーマンスの質問をすることは良いことですが、問題は、アプリケーションのコンテキストではお答えできません。残念ながら、両方のサンプルデータに対してプロファイリングするだけで、必要な答えを得ることができます。

DbConnectionについてはあまり気にする必要はありませんが、他のデータベース固有の接続クラスの基本クラスです。

あなたはNHibernateやEnterprise Library Data Access Application BlockのようなフレームワークのようなORMを考えましたか?これらはデータベースを抽象化するのに役立ちます(ORMを使用して、データベース内でコーディングを行う必要がない場合でも)。

更新:これまでのところ、あなたの唯一のオプションは、(例えばDbConnectionなど)提供の.NETベース・クラスまたはインタフェース(IDbConnection)を使用することであるかのように私はそれが表示されたコメントから言うことができるように。私の知る限りでは、接続文字列の正しい接続を与えることはできないので、その部分をコーディングする必要があります。接続文字列を検出したときにDbConnectionまたはIDbConnectionというコードで使用すると、OleDbConnectionOdbcConnectionSqlConnectionなどを返すことができます。したがって、基になるデータベースのコードには依存しません。

理想的ではありませんが、完璧に実行可能です。

+0

良い答えをありがとう。インターフェイスに対してプログラミングすることで、各データソースに対して複数回実装されるインターフェイスを持つ方が賢明だと思いますか?この問題は、データソースの事前知識がなく、接続するデータソースを指定するweb.config(設定済みの各ユーザー設定の変更)からの接続文字列のみを受け取ることになります。これは、可能なデータソースごとに実装をコード化しなければならないことを意味します。 – CSharpened

+1

@CSharpenedアプリケーションが動作する潜在的なデータベースに関する事前知識が必要です。あなたが行うことができるすべてでない場合、最も一般的な接続メカニズムとANSI SQL、つまりOLEまたはODBCを使用します。適合性の問題は、あなたがサポートしなければならないすべてのデータベースのうち、ODBCまたはOLEDBアクセスを提供するのか? –

+0

私のコードは、接続を行うために渡されるすべての接続文字列を単純に使用できるようにするために、あまり事前知識がありません。それはイライラしていますが、これは私が与えた要件です。それが実用的でないことが判明した場合、それは私が求められている概念を単に反証するので、一種のokです。今まで私が使用してきたほとんどのデータソースは、少なくともどちらか一方をサポートしていましたが、もっと曖昧なものには問題があるかもしれません。この段階では、Oracle、PostgreSQL、SQL Server、MySQL、Spatialiteに加えて、1つまたは2つのサポートを提供するように依頼されました。 – CSharpened

3

データアクセスを複数回コーディングすることなく、無関係なデータアクセス層が必要な場合は、DbProviderFactoryを使用するとよい選択です。

避けたい理由はありません。すべての必要な機能は基本クラスSystem.Data.Commonでカバーされています。

Nearforumsには、SQL ServerとMySqlの両方のdbスクリプトを提供しているため、無関係のデータアクセスが使用されています。パフォーマンスについては、異なる企業/コミュニティによって提供される特定のコネクタ(Oracle、MySql、PostgreSQL、...)の実装に依存します。ほとんどの既知のコネクタは、数年の間に適切にテストされていました。

+0

基本的なDbConnectionオブジェクトでDbProviderFactoryを使用することを意味しますか? – CSharpened

+1

右のサンプルをご覧ください:http://davidhayden.com/blog/dave/archive/2007/10/08/CreatingDataAccessLayerUsingDbProviderFactoriesDbProviderFactory.aspx – jorgebg

+1

ありがとうございます。それをよく読んでくれます。 – CSharpened

関連する問題