Wechsel zwischen Produktiv- und Test-Datenbank

  • VB.NET

Es gibt 19 Antworten in diesem Thema. Der letzte Beitrag () ist von GünterD.

    Wechsel zwischen Produktiv- und Test-Datenbank

    Moin Zusammen,

    ich möchte in einem Programm beim Start auswählen können ob die verwendeten Daten aus der aktuellen 'Produktiven-DB" oder aus der gleichstrukturierten "Test-DB" verwendet werden sollen.
    Ich brauchte eine Idee wie ich das realisieren kann. In einer Anwendung soll immer nur in einer DB 'gearbeitet' werden.
    Im Visual Studio-Fenster Datenquelle sind die beiden DB's techDBDataset (Produktiv-DB) und techDBDataset_Test (Test-DB) hinterlegt.
    Mein Versuch einfach den DataSetName händisch im VS zu ändern hat funktioniert.
    Aber wie kann ich im Programm dies per DropDown vom User ausführen lassen?

    Im Voraus bereits danke für eure Hilfe.

    Gruß Günter

    *Topic verschoben*
    Gruß Günter

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    Lass doch die DataSet (tDS) unangetastet und änder nur die Datenquelle der BindingSources. Wenn Du beide tDS-Instanzen auf dem Form hast, kannst Du eine BindingSource (Main-BS) hinzufügen, die als DataSource eine tDS-Instanz hat. Und andere BSs nehmen die erste BS als Datenquelle. Und wenn Du die angeschlossene DB über die jeweilige tDS-Instanz ändern willst, legst Du einfach die Datenquelle der Main-BS neu fest.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Am besten zeigst du einen Beispielcode von dem was du da nutzt. Denn da gibt es hunderte Möglichkeiten.

    Wenn die beiden Datenbanken gleich strukturiert sind und nur in einer gearbeitet wird dann habe auch nur ein DataSet in deinem Projekt.
    Der erste Punkt wo man eine Auswahl erreichen könnte, wäre zum Beispiel den ConnectionString abzuändern.

    Der Triple-Post...
    Das passt ja gerade gut, denn ich brauche soetwas ähnliches auch demnächst. :)

    Habe hier mal einen Ansatz. Wäre das so im Sinne von @VaporiZed :?:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.Data.SqlClient
    2. Public Class DBConnection
    3. Public Const DB_Production As String = "C:\DB\DB_Production"
    4. Public Const DB_Testings As String = "C:\DB\DB_Testings"
    5. ''--------------------------------
    6. Dim productionConnection As New SqlConnection(DB_Production)
    7. Dim testingConnection As New SqlConnection(DB_Testings)
    8. Dim currentConnection As SqlConnection
    9. Dim productionAdapter As New SqlDataAdapter("SELECT * FROM DieTabelle", productionConnection)
    10. Dim testingAdapter As New SqlDataAdapter("SELECT * FROM DieTabelle", testingConnection)
    11. Dim productionBindingSource As New BindingSource()
    12. Dim testingBindingSource As New BindingSource()
    13. Dim DataSet1 As New DataSet()
    14. Public Sub CreateDataSet()
    15. productionAdapter.Fill(DataSet1, "DieTabelle")
    16. testingAdapter.Fill(DataSet1, "DieTabelle")
    17. currentConnection = productionConnection
    18. productionBindingSource.DataSource = DataSet1.Tables("DieTabelle")
    19. testingBindingSource.DataSource = DataSet1.Tables("DieTabelle")
    20. End Sub
    21. Public Sub SwitchConnection(isProduction As Boolean)
    22. If isProduction Then
    23. currentConnection = productionConnection
    24. productionBindingSource.DataSource = DataSet1.Tables("DieTabelle")
    25. Else
    26. currentConnection = testingConnection
    27. testingBindingSource.DataSource = DataSet1.Tables("DieTabelle")
    28. End If
    29. End Sub
    30. End Class

    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    Wenn du schon beide DBs repräsentierst bis runter zur BindingSource, dann musst du doch diese dort austauschen, wo sie als DataSource genutzt wird, bei einem DGV z.B.
    Das CurrentConnection lässte einfach weg.
    Aber nur wenn du wirklich mit beiden DBs arbeiten willst, innerhalb eines Programmlaufs. Sonst reicht, eine BS, ein Adapter, eine Connection

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private ChooseCon As New Dictionary(Of Boolean, String) From {
    3. {True, "C:\DB\DB_Production"},
    4. {False, "C:\DB\DB_Testings"}}
    5. Private Adpt As SqlDataAdapter
    6. Private DataSet1 As New DataSet()
    7. Sub New()
    8. InitializeComponent()
    9. Dim ConString = ChooseCon(CBool(IO.File.ReadAllText("db.config")))
    10. Adpt = New SqlDataAdapter("Select 1", ConString)
    11. Adpt.Fill(DataSet1, "DieTabelle")
    12. End Sub
    13. End Class

    Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von „Haudruferzappeltnoch“ ()

    WasWieWoWer? Warum erstellst Du selber per Code BindingSources? Zieh sie doch als Komponente auf Dein Form. Auch ist Dein Vorgehen genau andersrum. Du setzt für 2 BSs die DataSource, obwohl ich was anderes schrieb. Wenn Du das so machen willst und es klappt, dann ok. Aber das hat wenig mit meinem Vorschlag zu tun.
    Meiner war:
    • tDS-Instanz 1 mit Verbindung zur Test-DB (DeinTestTds)
    • tDS-Instanz 2 mit Verbindung zur richtigen DB (DeinProduktivTds)
    • Main-BS mit DataSource vom Typ DeinTds, also im Designer festgelegt: MainBS.DataSource = GetType(DeinTds)
    • andere BSs (Unter-BindingSources), deren DataSource die MainBS ist und deren DataMember die jeweilige Tabelle ist, die für die jeweilige Unter-BS gebraucht wird.
    • der eigentliche Umschaltcode, der dann die DataSource für die MainBS festlegt, also entweder MainBS.DataSource = DeinTestTds oder MainBS.DataSource = DeinProduktivTds
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    GünterD schrieb:

    ich möchte in einem Programm beim Start auswählen können ob die verwendeten Daten aus der aktuellen 'Produktiven-DB" oder aus der gleichstrukturierten "Test-DB" verwendet werden sollen.
    Ich brauchte eine Idee wie ich das realisieren kann. In einer Anwendung soll immer nur in einer DB 'gearbeitet' werden.
    Im Visual Studio-Fenster Datenquelle sind die beiden DB's techDBDataset (Produktiv-DB) und techDBDataset_Test (Test-DB) hinterlegt.
    Der letzte Satz zeigt, dass du auf dem Holzweg bist.
    Für dein Vorhaben darfst du nur ein tDS haben.
    Und du solltest genau das tun, was du tun willst: "beim Start auswählen können ob die verwendeten Daten aus der 'Produktiven-DB" oder aus der "Test-DB" verwendet werden."
    Um das zu tun brauchst du kein zweites Dataset, sondern nur einen zweiten ConnectionString.
    @EDR
    Um das zu tun brauchst du kein zweites Dataset, sondern nur einen zweiten ConnectionString.

    ... dies leuchtet mir mittlerweile ein.

    Ich stehe nur einfach auf der Leitung, wie ich den VerbindungsString beim Programmstart durch den User entsprechend anpassen kann.

    Im Server-Explorer ist die Datenverbindung mit einer grau hinterlegten Verbindungszeichenfolge angegeben:
    Data Source=175.10.XXX.YYY;Initial Catalog=techDB;Persist Security Info=True;User ID=techDB;Password=***********

    Ich habe nichts gefunden, wie ich aus Initial Catalog=techDB --> Initial Catalog=techDB_Test machen kann???
    ... oder evtl. die ganze Verbindungszeichenfolge anpassen kann.

    Vielleicht dazu einen Tipp!!!
    Gruß Günter

    VB.NET-Quellcode

    1. Dim IP as string ="175.10.XXX.YYY"
    2. Dim DB as string ="techDB"
    3. dim User as string ="techDB"
    4. dim PW as string ="**"
    5. dim connString as String = String.Format("Data Source={0};Initial Catalog={1} Security Info=True;User ID={2};Password={3}", IP, DB, User, PW)

    Ungetestet runtergeschrieben
    NB. Es ist doch schön, wenn man lesbare Namen vergibt. Siehe auch [VB.NET] Beispiele für guten und schlechten Code (Stil).
    Tja, du scheinst mit generierten typisierten TableAdaptern zu arbeiten.
    Die sind ziemlich gruselig, und festverdrahtet ziehen die an zig Stellen je ihren Connectionstring aus der Config.
    Zur Laufzeit umstellen ist da ziemlich unmöglich.
    Vorgesehen ist ja, dass der ConnectionString in der <App>.exe.Config steht, und wenn du die DB wechseln willst, machst du das Proggi aus, und legst eine andere Config hin.

    Ich verwende immer dieses hier: Dataset->Db (DbPersistance)
    Da ist das Herumswitchen von Connections auch nicht wirklich vorgesehen, aber weils da nur eine einzige Connection gibt, ist immerhin prinzipiell einfacher möglich, das noch einzubauen.
    @'INOPIAE

    Das klappt so nicht, da ich für die Änderung der Verbindung sicherlich die "global" Verbindungszeichenfolge ändern muss, oder?

    @EDR
    das siehst du vollkommen richtig!
    Ok, mit der Änderung des entsprechenden ConnectionString in App.config komme ich mit der zugehörigen EXE direkt auf die "Test"-DB.
    ... dann muss ich aktuell mit 2 verschiedenen EXE leben.
    Aber in Zukunft werde ich die Verbindung nicht generieren lassen.

    Gruß Günter

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „GünterD“ ()

    Und deswegen mein Vorschlag: 2 Datasets, bei dem jedes für sich einen passenden ConnectionString hat und dann sollte das Umschalten zur Laufzeit kein Problem sein.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @VaporiZed

    ... und wie biege ich dann die als Globale Variable in der App.config hinterlegte Verbindung um?

    Oder meinst du, dass ich 2 neue Datasets einrichte, von der eine mit "Produtiv" und eine mit "Test" verbunden ist, und die jeweilig "ausgewählte DB" einer neu zu erstellenden Public DatasetAktuell zuweise?
    Anschließend müsste ich dann noch alle bereits vorhandenen "alten" Verbindungen, die den Eintrag in App.config verwenden, mit DatasetAktuell ersetzten?
    Würde das überhaupt so funktionieren?
    Gruß Günter
    Mein Gedankengang:
    • Du erstellst (insgesamt) 2 DataSets per DataSet-Designer.
    • Die DataTables wirst Du von einem zum anderen kopieren können, da die Datenstruktur ja hoffentlich gleich ist.
    • Bei jedem DataSet hinterlegst Du im DataSet-Designer einen ConnectionString: Für das erste DataSet die Verbindung zur Test-DB, beim zweiten die zur richtigen DB.
    • Du kompilierst.
    • Du ziehst beide DataSet-Einträge, die in der Werkzeugbox auftauchen, auf's Hauptform. Damit hast Du - ich nenn sie mal so - DSTest und DSProduktiv.
    • Nun hast Du bei den Komponenten 2 DataSet-Vermerke.
    • Du ziehst eine BindingSource-Komponente auf Dein Form. Ich nenne sie mal BS1
    • Dafür legst Du als DataSource die Test-DataSet-Komponente fest, die ja ebenfalls schon auf dem Form ist.
    • Weitere BindingSources kommen hinzu und nehmen als DataSource die erste BindingSource, also BS1, und als DataMember die jeweiligen Tabellen, also eine DataTable pro BindingSource.
    • Deine Controls bindest Du an die passenden BindingSources.
    • zur Laufzeit: Wenn Du umschalten willst, musst Du jetzt nur noch die DataSource der BS1 festlegen: entweder ist die DataSource dann DSTest oder DSProduktiv. Mehr ist nicht zur Laufzeit zu tun.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @VaporiZed

    Ich glaube deine Gedanken würden bei meiner Anwendung funktionieren.
    Aber irgendetwas habe ich nicht verstanden oder mir fehlt der Hintergrund.
    Ich hänge bei
    ​Weitere BindingSources kommen hinzu und nehmen als DataSource die erste BindingSource, also BS1, und als DataMember die jeweiligen Tabellen, also eine DataTable pro BindingSource.


    Auf meinen Forms (38 Stück) habe ich beim damaligen Anlegen die entsprechende Table aus der Dataset-List in die Form gezogen.
    Dabei haben sich die verschiedenen Tableadapter mit den zugehörigen Bindingsource automatisch generiert.

    Was mach ich jetzt mit den dabei generiert zugehörigen TableAdapter?
    z.B.

    VB.NET-Quellcode

    1. ​Me.Tbl_AnsprechpartnerTableAdapter.Fill(techdbdataset.tbl_Ansprechpartner)

    Hierbei ist

    Quellcode

    1. techdbdataset
    die automatisch generierte (alte) Datenquelle.

    Hast du noch einen Tipp?
    Gruß Günter