Announcement

Collapse
No announcement yet.

My.Settings.Settings.PropertyValue zur Laufzeit ändern

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • My.Settings.Settings.PropertyValue zur Laufzeit ändern

    Hallo liebes Forum,

    ich möchte beim Start eines Programms prüfen, ob die Verbindung zur Datenbank (Access) Ok ist, und wenn das nicht der Fall ist den OleDb-ConnectionString neu definieren.

    Ich habe es so probiert:

    Code:
    ...
    Dim conString As String = My.Settings.WaldJagdConnectionString.ToString
    Dim con As New OleDbConnection
     
    con.ConnectionString = conString
     
    If con.State = ConnectionState.Closed Then
     
     Try
     
     con.Open()
     
     Catch ex As  Exception
         Me.OpenFileDialog1.RestoreDirectory = True
         Me.OpenFileDialog1.ShowDialog()
         My.Settings.PropertyValues.Item("OleDBConnectionString").PropertyValue = Me.OpenFileDialog1.FileName.ToString
         My.Settings.Save()
     
     End Try
     
    End If
    ...
    
    ist aber wieder einmal nicht die Lösung.

    <Edit>Entschuldigt bitte: My.Settings.Settings ist ReadOnly - gibt es für das Problem trotzdem eine Lösung? <\Edit>

    liebe Grüsse
    Christian
    Zuletzt editiert von cb4866; 21.01.2009, 21:11. Reason: My.Settings.Settings ist ReadOnly

  • #2
    Man darf nur userabhängige Settings ändern. Die Lösung wäre also deinen ConnectionString im userabhängigen Teil(Scope = User) der Konfiguration zu speichern und nicht im applikationsabhängigen(Scope = Application).

    Ich vermute aber mal du arbeitest mit typisierten Datasets und willst dort den automatisch mit dem Tableadapter verknüpften Connectionstring ändern damit du nicht im Code ständig an den Tableadaptern die Connection austauschen mußt? Dann gibt es da wohl keine Lösung weil dir zur Designzeit nur die applikationsabhängige Konfiguration zur Verfügung steht.

    Es führt wohl kein Weg daran vorbei den Connectionstring wo anders zu speichern und dann vor jedem benutzen eines Tableadapters diesem ein Connection Objekt mit korrektem Connectionstring zu übergeben.

    Kein Weg heißt hier übrigens eher .... kein vernünftiger Weg. Es gibt ein paar fiese Lösungen die darauf beruhen das man dem Tableadapter eine andere Basisklasse unterjubelt(Wenn du mal im Dataset Wizzard guckst der Tableadapter hat eine BaseClass Property) die dann per Reflection auf sich selber die Connectionproperty ändert. Das Connection Object wird ja erst später generiert deshalb kennt die Basisklasse die noch nicht und muß das deshalb per Reflection machen. Wenn dich dieser Weg interessiert google mal nach 'Tableadapter Baseclass' und du wirst einige wilde Lösungen finden.

    Comment


    • #3
      Hallo Ralf,

      danke für deine Tips, ja es geht um den Verbindungsaufbau für ein typisiertes Dataset (typisierte DataTables).

      liebe Grüsse
      Christian

      Comment


      • #4
        Es führt wohl kein Weg daran vorbei den Connectionstring wo anders zu speichern und dann vor jedem benutzen eines Tableadapters diesem ein Connection Objekt mit korrektem Connectionstring zu übergeben.

        ... und wie kann man das am elegantesten lösen (bei einem automatisch angelegten Tableadapter im typisierten Dataset) ?
        Meinst Du das so, dass man ConnectionModifier des TableAdapters auf Public stellen sollte und dann die Connection einer Instanz des automatisch erstellten TableAdapters vor der Verwendung setzen sollte.

        Danke
        Hermann
        Zuletzt editiert von Hermann Schmidt; 31.03.2009, 13:03.

        Comment


        • #5
          Dem Tableadapter kann man eine eigene Basisklasse unterjubeln. Siehe BaseClass Property des Tableadapters im Designer.

          In einer entsprechenden Basisklasse könntest du eine eigene Connectionstringermittlungsmethode implementieren ohne dann im Anwendungscode überall Connectionstring Zuweisungen reinprogrammieren zu müssen.

          Einzige Schwierigkeit die Connection Property wird ja erst vom Designer generiert somit kann eine Basisklasse da nicht einfach drauf zugreifen da diese ja nocht nicht bekannt ist.
          Man muß also per Reflection auf sich selbst (aus der Sicht der Basisklasse) zugreifen, die Connection Property suchen und dieser dann den Connectionstring zuweisen.


          PS. Bitte für neue Fragen demnächst einen neuen Thread aufmachen.

          Edit : Gerade gesehen das ich den selben Tipp schon vor Monaten in diesem Thread gegeben habe. Sorry.

          Comment


          • #6
            Ich habe das auf eine ganz eigene wenn auch nicht ganz einfache Art gelöst mit der es mir endlich möglich ist auch mit typisierten Datasets und einer UserProperty zu arbeiten.

            Bei Intresse werd ich sie posten muss da aber nochmal alle Schritte testen, da es schon wieder 2-3 Wochen her ist.
            Unsere Jugend ist unerträglich, unverantwortlich und entsetzlich anzusehen! - Aristoteles

            Comment


            • #7
              Interesse !

              Comment


              • #8
                Nun folgendes ist zu tun. Wir gehen davon aus dass bereits ein typisiertes Dataset im Designer vorliegt. Welches mit Tables und passenden Datatables erstellt ist. Außerdem wird davon Ausgegangen dass wir für die Verbindungszeichenfolge beim Erstellen angegeben haben wir möchten Sie mit Namen "ConnectionString" speichern.

                Um jetzt zu erreichen dass die Property des ConnectionStrings wie eine Benutzer Einstellung geändert werden kann unternehmen wir folgende Schritte wir schließen dass Dataset im Designer.

                Nun ändern wir den Namen der Property "ConnectionString" in "ConnectionString1"
                Erstellen eine neue Property im Benutzerbereich, benennen Sie "ConnectionString" und weisen ihr als Standardwert den selben zu wie bei "ConnectionString1"

                Dann in einem Texteditor die Datasetname.xsd (wobei Datasetname hier für den Namen deines Datasets bzw. der Datei des Datasets entspricht) öffnen und im Abschnitt <Connections> wird folgendes geändert

                Code:
                <Connection AppSettingsObjectName="MySettings" AppSettingsPropertyName="ConnectionString1" ConnectionStringObject="" IsAppSettingsProperty="True" Modifier="Assembly" Name="ConnectionString1 (MySettings)" PropertyReference="ApplicationSettings.WindowsApplication1.My.MySettings.GlobalReference.Default.ConnectionString1" Provider="System.Data.OleDb">
                          </Connection>
                Je nach aufbau deines Datasets könnte hier mehrmals ein <Connection> Objekt auftauchen für uns ist jedoch nur das von Belang das so aussieht wie das.
                Nun ändern wir das Attribut PropertyReference in folgenden wert
                Code:
                ApplicationSettings.WindowsApplication1.My.MySettings.GlobalReference.Default.ConnectionString
                und speichern die Datei. Jetzt ist es uns möglich die Einstellung variabel zu halten.
                Problem an der Sache ist dass dies erst zum Schluß der Entwicklung geschehen sollte. Da man im DatasetDesigner nicht uneingeschränkt arbeiten kann. Man sollte sich dafür immer eine Application Property so wie sie am Anfang war beibehalten, dann kann man bequem arbeiten. Und im letzten Schritt werden dann noch die Connections der TableAdapters geändert.
                Keine ganz saubere. Aber zumindest einfachere Lösung

                ich muss aber auch sagen dass ich mit meiner Lösung natürlich nicht zufrieden bin ich arbeite gerade an dem Vorschlag von Jürgen mal sehen was dahingehend noch machbar sein wird
                Zuletzt editiert von das-d; 31.03.2009, 20:33.
                Unsere Jugend ist unerträglich, unverantwortlich und entsetzlich anzusehen! - Aristoteles

                Comment

                Working...
                X