3

このように実行時に接続文字列を変更できます。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 番目の接続文字列に何らかの方法で適用できますか?

4

3 に答える 3

1

もう少しテストしたところ、クラス ライブラリ内で同じソリューションを使用 できること がわかりました。

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

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 全体ではなく、短い名前)。クラス ライブラリで別の名前の接続を使用してテストしたことはありませんが、問題にはならないと思います。

于 2009-01-19T11:27:28.390 に答える
0

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

唯一のオプションは、アプリを再起動するか、Webアプリケーションの場合はアプリプールを再循環することです。それを超えて、あなたはあなた自身を転がさなければならないでしょう。

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

于 2009-01-16T21:39:00.003 に答える
0

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

    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()

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

于 2009-01-16T15:25:28.307 に答える