Dynamischer ConnectionString

  • VB.NET

Es gibt 19 Antworten in diesem Thema. Der letzte Beitrag () ist von us4711.

    Dynamischer ConnectionString

    VB1963 schrieb:

    Hier würde ich dir beim Parameter DataSource die Angabe |DataDirektory| empfehlen.
    Ein kleiner Auszug aus dem Buch Datenbank-Programmierung mit VB2010 (W. Doberenz, T. Gewinnus):
    Die Angabe von DataDirectory in einem ConnectionString steht in einer Windows Forms-Anwendung für das Verzeichnis in dem sich die *.exe befindet.


    Hallo VB1963:

    Ich habe mal im ConnectionString in den Settings meines VB.NET Projektes als DataSource |DataDirectory| angegeben.
    Da ich auf eine Sql-Server-DB zugreife und diese beim Start der Anwendung per initialiserungscode entsprechend zuweisen möchte, habe ich folgendes aufgerufen AppDomain.CurrentDomain.SetData("DataDirectory", "DE-LEO-SQL01\DKEMS"). Leider komme ich damit nicht wirklich auf den angegeben Server bzw. die Datenbank.
    Weist Du was ich verkehrt mache? Oder ist es überhaupt nicht möglich per Code in den Connection-String in den globalen Einstellungen einzugreifen?
    Oder klappt das ganze vllt. mit SQL-Verbindungen nicht?

    Viele Grüße
    Frank

    Aus "dynamischer Pfad" für DB ausgelagert. Bitte keine fremden Threads für eigene Fragen "missbrauchen", sondern stattdessen einen neuen Thread erstellen. ~Thunderbolt

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Thunderbolt“ ()

    Dynamischer Connection String

    @VB1963

    Ja, DE-LEO ist die Domäne, SQL01 ist der Rechner- bzw. Servername, DKEMS ist der SQL Instanzname.
    Wenn ich diesen Pfad anstatt |DataDirektory| für die DataSource im Connection String eintrage funktioniert es (Data Source=DE-LEO-SQL01\DKEMS;Initial Catalog=Kunda;Integrated Security=True)

    Unter Initialkatalog im Connection String gebe ich dann die entsprechende Datenbank an.

    Vollzitat entfernt. ~Trade
    Bilder
    • ConnectionString.JPG

      102,43 kB, 1.593×448, 195 mal angesehen

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Trade“ ()

    Vollzitat entfernt. ~Trade

    Klappt leider nicht...
    DKEMS ist die SQL Server Instanz... Also Quasi der Schrank indem sich sämtliche DBs befinden. Davon habe ich 3 verschiedene und sollte sie je nach Umgebung (Test, Entwicklung oder Produktion) ändern können.
    Meine DB heisst Kunda. Diese hab ich auch als Initial Catalog in der Verbindung hinterlegt.

    DE-LEO-SQL01 ist der Servername auf dem die Instanz installiert ist.

    Wenn ich es richtig sehe, kann ich immer nur den obersten Ordner, was in meinem Fall der Rechner ist, parametrisieren.
    Da ich aber erst den Ordner bzw. die Instanz auf dem Server parametrisieren möchte (davon habe ich nämlich jeweiles für Test, Entwicklung und Produktion unterschiedliche (DKEMSTST, DKEMSDEV und DKEMS), habe ich vermutlich keine Chance, das auf diesem Weg zu realisieren oder?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Trade“ ()

    Vollzitat entfernt. ~Trade

    Geht leider auch nicht ;(
    Ist echt ne ganz schöne testerei bis man mal was funktinionierendes rausgefunden hat.

    Irgendwie hab ich das Gefühl, dass das DataDirectory den Namen nicht auflöst. Wenn ich den ConnectionString abfrage kommt das raus:
    Data Source=|DataDirectory|\Kunda.mdf;Integrated Security=True.
    Müsste da nicht anstatt dem |DataDirectory| dann DE-LEO-SQL01\DKEMS zurückgeliefert werden?

    So frage ich den Connection String ab:

    VB.NET-Quellcode

    1. Private Sub GetConnectionStrings()
    2. Dim settings As ConnectionStringSettingsCollection = ConfigurationManager.ConnectionStrings
    3. If Not settings Is Nothing Then
    4. For Each cs As ConnectionStringSettings In settings
    5. Console.WriteLine(cs.ConnectionString)
    6. Next
    7. End If
    8. End Sub

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „Trade“ ()

    Dynamischer ConnectionString

    Vollzitat entfernt. ~Trade

    Erst mal auch danke für Deine Hilfe und Mühe :)

    Also iwas muss wohl bei mir nicht stimmen...

    Bei beiden Buttons bekomme ich ein Fehler beim Öffnen der Verbindung und der Connection String ist jedesmal derselbe (s. Screenshot).
    Dateien

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Trade“ ()

    Ich hab' die Anpassung mal so gelöst:

    VB.NET-Quellcode

    1. Namespace My
    2. Partial Friend NotInheritable Class MySettings
    3. Inherits Global.System.Configuration.ApplicationSettingsBase
    4. Public Sub SetUserOverride(ByVal BezeichnungDesSettings As String, ByVal Value As String)
    5. Me(BezeichnungDesSettings) = Value
    6. End Sub
    7. End Class
    8. End Namespace
    Vollzitat eines Vorposts an dieser Stelle entfernt ~VaporiZed

    Sorry, ich bin noch im Anfangsstadium von der Objektorientierten Programmierung und habe noch nicht wirklich viel Kenntnisse von Namespaces und Klassen... Das es Sie gibt, weis ich aber :D

    Kannst Du mir sagen, wie ich deinen Code implementieren muss... Muss ich dafür einen Klasse anlegen o.ä.? Oder wie kann ich die darin enthaltene Sub letztendlich aufrufen.


    @Petaod:
    Ja stimmt, dass es vermutlich [b]Server[/b]=DE-LEO-SQL01\INSTANZNAME heissen muss, wobei es auch mit [b]Data Source[/b]=DE-LEO-SQL01\INSTANZNAME funktioniert.

    In meinem Anliegen geht es darum, über das DataDirectory die gewünschte SQL-Server-Adresse bzw. Instanz zu paramatrisieren.
    Ich habe allerdings das Gefühl, dass das DataDirectory den Namen nicht wirklich auflöst.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „VaporiZed“ ()

    Voraussetzung: Der CategoriesTableAdapter ist generiert, und der NwindConnectionString ist in den Settings eingetragen.

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    3. MessageBox.Show("Originaler ConnectionString" & Environment.NewLine & My.Settings.NwindConnectionString)
    4. Dim MeinNeuerConnectionString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source='D:\Test\Nwind.mdb'"
    5. My.Settings.SetUserOverride("NwindConnectionString", MeinNeuerConnectionString)
    6. MessageBox.Show("Veränderter ConnectionString" & Environment.NewLine & My.Settings.NwindConnectionString)
    7. Me.CategoriesTableAdapter.Fill(Me.NwindDataSet.Categories)
    8. End Sub
    9. End Class
    10. Namespace My
    11. Partial Friend NotInheritable Class MySettings
    12. Inherits Global.System.Configuration.ApplicationSettingsBase
    13. Public Sub SetUserOverride(ByVal BezeichnungDesSettings As String, ByVal Value As String)
    14. Me(BezeichnungDesSettings) = Value
    15. End Sub
    16. End Class
    17. End Namespace
    @us4711:
    Perfekt, Dein Code trifft genau das was ich suche :thumbup:

    Mit diesem kleinen Codeschnipsel kann mit Angabe des Namens als Kriterium sehr einfach der Wert (in meinem Fall der ConnectionString meiner Anwendung) in den Einstellungen per Code geändert werden:

    VB.NET-Quellcode

    1. Namespace My
    2. Partial Friend NotInheritable Class MySettings
    3. Inherits Global.System.Configuration.ApplicationSettingsBase
    4. Public Sub SetUserOverride(ByVal BezeichnungDesSettings As String, ByVal Value As String)
    5. Me(BezeichnungDesSettings) = Value
    6. End Sub
    7. End Class
    8. End Namespace


    Im Prinzip bräuchte man dann den Ansatz über das DataDirectory nicht mal, da man hiermit den kompletten ConnectionString austauschen kann.
    @frankseipferd
    Genau, und das funktionier mit ALLEN Settings. Dabei ist natürlich der Datentyp von value zu beachten, machst Du einfach eine zweite Funktion mit anderem Datentyp. Geht wohl auch mit dem Datentyp Object, ab das kann Laufzeitfehler bewirken, durchaus NICHT zu empfehlen.