実行時にメインアプリケーションのクラスライブラリから接続文字列を変更する
-
19-08-2019 - |
質問
このように、実行時に接続文字列を変更できます。 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アプリケーションの場合、アプリを再起動するか、アプリプールを再サイクルすることです。それを超えて、あなたはあなた自身を転がす必要があります。
できる限りのことをしました:-)