3

私が開発している ASP.NET Web アプリケーションは、Access と MS SQL Server 2008 Express という 2 種類のデータベースをサポートする必要があります。

各データベース タイプの接続文字列は既に web.config に格納されており、使用するものを指定する別の web.config 値があります。したがって、問題なく適切な接続文字列を取得できます。

大きな問題は、データベース オブジェクトにあります。既に実装した Access の場合、コード内でオブジェクト OleDbConnection、OleDbCommand、および OleDbDataReader を使用してデータベース呼び出しを行います。

SQL Server の場合、これらのオブジェクトを使用できないようですが、基本的に同じことを行うには、SqlConnection、SqlCommand、および SqlDataReader オブジェクトを使用する必要があります。

現在のコードをできるだけ再利用したいので、データベースの種類ごとに 2 つの個別のブロックを作成する必要はありません。(OleDbDataReader をパラメーターとして受け取るメソッドがたくさんあります。たとえば、これらのメソッドをそれぞれ 2 つ作成する必要はありません。)

接続オブジェクトは両方とも DbConnection を継承していることに気付きました。データ リーダー (DbDataReader) とコマンド (DbCommand) についても同様です。

Access の既存のコードを使用して、すべての Ole オブジェクトを Db オブジェクトに置き換え、現在のデータベースの種類に応じて、それらのオブジェクトを適切な型としてキャストすることは可能でしょうか?

1 つの ASP.NET アプリケーションで 2 つのデータベース タイプをサポートするためのベスト プラクティスはありますか?

それが役立つ場合は、コードの一部を追加できます。ありがとう。

4

2 に答える 2

0

欠落している可能性のあるリンクは、DbProviderFactoriesクラスの機能です。このクラス(およびSystem.Data.Common内の関連するヘルパー)を使用すると、プロバイダーを抽象化し、基本クラス(DbConnectionやDbCommandなど)への参照を使用して作業を行うことができます。次のようになります。

private void DoSomething(string provider, string connectionString, string something)
{    
    DbProviderFactory factory = DbProviderFactories.GetFactory(provider);
    DbConnection connection = factory.CreateConnection();
    connection.ConnectionString = connectionString;
    DbCommand command = connection.CreateCommand();
    command.CommandText = something;
    DbDataReader reader = command.ExecuteReader();
    //etc...
}

プロバイダー名は取得するのが少し難しいですが、DbProviderFactories.GetFactoryClasses()によって返されるものの1つと一致する不変のクラス名である必要があります。または、単にハードコーディングすることもできます。それらはあまり変更されませんが、コードに埋め込まれたマジックストリングであり、最終的に問題を引き起こす可能性があります。

追加機能には、factory.CreateCommandBuilderを介してアクセスできます。これは、プロバイダーがパラメーターなどを処理する方法の違いを調べるのに役立ちます。

于 2010-09-23T22:31:10.033 に答える
0

はい、フレームワーク 2.0 から、すべてのデータ リーダーはDbDataReaderクラスから継承されるため、メソッドは のDbDataReader代わりにOleDbDataReader使用でき、任意のデータベースでメソッドを使用できます。

ただし、データベースには SQL の方言が異なるため、使用するすべてのデータベースで機能する機能の狭いパスにとどまるか、一部のタスクに対して個別のクエリを使用する必要があります。

違いの具体的な例として、Access では のようなデータ リテラルが使用され#2010-09-24#、SQL Server では のような日付リテラルが使用されます'2010-09-24'。一般に、日付に関係するほとんどのことは異なります。

于 2010-09-23T22:20:26.877 に答える