3

アプリの複数のコピーが同じデータベースを使用する MySQL データベースを使用する VB6 アプリを置き換える C# アプリを作成中です。新しいアプリは現在の MySQL データベースを使用できる必要がありますが、アプリの将来のインスタンスがユーザーが必要とするサーバーを使用できるように、データベースに依存しないようにしたいと考えています。完璧な世界では、アプリを最初に実行したときに、ユーザーがデータベースの種類 (MySQL、SQL Server など) を選択し、サーバーの IP、ユーザー、パスワード、およびデータベースを指定できるダイアログを表示するようにしたいと考えています。名前。その後、アプリはそのサーバーに接続し、データベースが既に存在する場合はそれを使用し、存在しない場合は新しいデータベースを作成します。

Code First を使用することで、既存のデータベースを使用する方法や新しいデータベースを作成する方法を理解できるようになりましたが、App.config ファイルに接続文字列をハード コーディングするだけで済みます。

    <add name="GumpIndexDatabase"
     connectionString="server=localhost;userid=123;password=123;port=3306;database=gump_new_data;pooling=false;"
     providerName="MySql.Data.MySqlClient"
     />

アプリを起動する前に接続文字列とプロバイダーを変更すると、すべてが期待どおりに機能します。起動後に接続文字列を変更することもできますが、プロバイダーは変更できません。接続文字列の詳細を正しく取得するには、プロバイダーが MySQL であるか MSSQL であるかを知る必要があります (例: ユーザーまたはユーザー ID)。

class GumpIndexDatabase: DbContext
{
    public GumpIndexDatabase(string connectionName)
        : base(MakeConnectionString(connectionName))
    {
    }
    private static string MakeConnectionString(string connectionName)
    {
         if (connectionName=MySQL) {
             //return MySQL string
         } else {
             //return SQL Server string
         }
    }

何時間にもわたって検索しても、そのようなことを行う方法の例は見つかりませんでした. 接続文字列ビルダーに関する記事をいくつか見ましたが、汎用オブジェクトからデータベース固有の文字列を取得する方法がわかりませんでした。

簡単な質問: 実行時にデータベース接続の詳細を指定する方法は?

4

2 に答える 2

1

この機能なしでは生きていけないと 100% 確信している場合を除き、この機能を強制することはお勧めしません。現時点では明らかではない多くのメンテナンス タスクが追加されます (新しいバージョンへの更新、バグ修正、一般的なインターフェイスを理解するために多くの時間を費やす、それらのインターフェイスを維持する、大量のテストなど)。したがって、それが要求されたビジネス機能でない限り、忘れてください。

ただし、自分が何をしているのかを知っていれば、この問題は通常、インターフェースを介して解決されます。これらの一般的なインターフェースがあるかもしれません (それらを理解するのは、それ自体のタスクです):

  • IConnection
  • IDataProvider
  • IRepository<T>

現時点では、MySql データベースを使用してインターフェイスを実装しますclass MySqlConnection : IConnection。MS SQL が必要な場合は、class MsSqlConnection : IConnection.

事実上、すべての機能を共通のインターフェイスに抽象化する必要があります。サポートするデータベース/ストレージ エンジンごとに実装を提供する必要があります。実行時に、IoC コンテナーと DI 原則を使用して、現在の実装をセットアップします。すべての子依存関係は、コンストラクター (またはプロパティまたはメソッド) にパラメーターとして渡されるインターフェイスを使用します。

于 2013-03-27T22:19:10.390 に答える
0

Databaseプロパティを試しましたか?

GumpIndexDatabase.Database.Connection.ConnectionString = "your conn string";

非常に短いテストをしただけなので、問題なく動作する保証はありません。しかし、サービス層クラスの 1 つのコンストラクターでそれを使用することに成功しました。

public class MyService
{
    protected DataContext DataContext { get; set; }

    public MyService(DataContext dataContext)
    {
        DataContext = dataContext;
        DataContext.Database.Connection.ConnectionString = "conn string";
    }
}

DbContextオーバーロードがあるのを見ましたDbContext(string nameOrConnectionString)。これも使えるはずです。

既存の接続の使用

または、既存の接続を使用します。次のDbContextようなものが必要です。

public class DataContext : DbContext
{
    public DataContext(DbConnection existingConnection)
        : base(existingConnection, true) { }
}

そして、必要な場所で初期化します。

public void SomeMethod()
{
    var connString = "whatever"; // could also be something like Textbox1.Text
    using (var connection = new SqlConnection(connString))
    {
        var context = new DataContext(connection);
    }
}

もちろんSqlConnection、から継承するものなら何でもかまいませんDbConnectionDbConnection クラスを参照してください。

于 2013-03-27T19:44:55.423 に答える