実行時にメインアプリケーションのクラスライブラリから接続文字列を変更する

StackOverflow https://stackoverflow.com/questions/450598

質問

このように、実行時に接続文字列を変更できます。 MySettingsクラス内の個別のプロパティとして、接続文字列設定を書き込み可能にします。

Partial Friend NotInheritable Class MySettings
    Public WriteOnly Property RunTimeConnectionString()
        Set(ByVal value)
            My.Settings("MyConnectionString") = value
        End Set
    End Property
End Class

次に、アプリケーションを初期化するとき(型指定されたデータセットのテーブルアダプターを使用する前)に、次のように記述します。

My.Settings.RunTimeConnectionString = My.Settings.ProductionConnectionString

ProductionConnectionStringは、単純な文字列設定です。これはユーザースコープ設定であるため、すべてのユーザーが(上記のコードと同様に値を割り当てることにより)変更し、My.Settings.Save()を呼び出して保存することができます

このコードは、最初にメインプロジェクトで作成され、その設定(= app.configファイル)に保存された接続文字列に適しています。

app.configの接続文字列は、実際にはもっと長い名前です:MyApp.MySettings.MyConnectionString。

クラスライブラリプロジェクトのapp.configに接続文字列を保存し、メインプロジェクトでそのプロジェクトを参照すると、app.configファイルが何らかの形でマージされるため、クラスライブラリに設定があります。

実行方法がわからないことは、実行時にクラスライブラリの設定を変更することです。接続文字列設定をクラスライブラリからメインプロジェクトのapp.configにコピーできます。 MyClassLibrary.My.MySettings.MyConnectionStringのような同じ名前を保持する必要があります。

上で示した同じ原理をこの2番目の接続文字列に何らかの形で適用できますか?

役に立ちましたか?

解決

もう少しテストしましたが、同じソリューション クラスライブラリ内で使用できる >。

次のような共有(静的)メソッドで(クラスライブラリ内に)新しいクラスを作成しました。

Public Class MySettingsChanger
    Public Shared Sub SetConnectionString(ByVal cnnString As String)
        My.Settings.RunTimeConnectionString = cnnString
    End Sub
End Class

メインプロジェクトと同じ方法で(クラスライブラリ内の)MySettingsクラスを拡張しました:

Namespace My
    Partial Friend NotInheritable Class MySettings
        Public WriteOnly Property RunTimeConnectionString()
            Set(ByVal value)
                My.Settings("MyConnectionString") = value
            End Set
        End Property
    End Class
End Namespace

少なくとも私の場合は動作します。メインプロジェクトとクラスライブラリの接続の名前は同じだけです(ProjectNamespace.MySettings.ConnectionName全体ではなく、短い名前)。クラスライブラリで別の名前の接続を使用してテストしたことはありませんが、それは問題ではないと思います。

他のヒント

さらに検索して方法を見つけましたが、実際には実行されません。少なくとも私が望んでいるほどランタイムではありません。とにかく、ここにコードがあります、私はそれをテストし、動作しましたが、最初にアプリケーションを再起動する必要がありましたそれは私にとってあまり実行時間ではありません。

    Dim configLocation As String = Reflection.Assembly.GetExecutingAssembly().Location
    Dim config As Configuration.Configuration = Configuration.ConfigurationManager.OpenExeConfiguration(configLocation)
    config.ConnectionStrings.ConnectionStrings.Clear()
    For i As Integer = 0 To Configuration.ConfigurationManager.ConnectionStrings.Count - 1
        Dim connection As New Configuration.ConnectionStringSettings(Configuration.ConfigurationManager.ConnectionStrings(i).Name, My.Settings.ProductionConnectionString)
        connection.ProviderName = Configuration.ConfigurationManager.ConnectionStrings(i).ProviderName
        config.ConnectionStrings.ConnectionStrings.Add(connection)
    Next
    config.Save()

これは、このコードを見つけた記事です。

ブログのメッセージをありがとう。はい、変更を有効にするには実行を停止する必要があるため、ほとんど実行時ではありません。残念ながら、設定は一度だけ(アプリドメインが読み込まれるとき)読み込まれるため、実行中に設定インフラストラクチャが変更を取得する方法はありません。

唯一のオプションは、Webアプリケーションの場合、アプリを再起動するか、アプリプールを再サイクルすることです。それを超えて、あなたはあなた自身を転がす必要があります。

できる限りのことをしました:-)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top