Announcement

Collapse
No announcement yet.

Datenbankfelder in Variablen und zurück?

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

  • Datenbankfelder in Variablen und zurück?

    Hallo,

    ich bin bei VB-Net ein blutiger Anfänger. Ich habe meine Formulare mit Dataadapter und Dataset verbunden und kann auch innerhalb dieser Datenbank blättern.

    Aber ich komme in der Programmierung nicht weiter. Wahrscheinlich brauche ich nur einen Denkanstoß:

    wie kann ich ein feld einer Datenbank (z.b. den Ort aus einer Adressdatenbank) in eine Variable speichern?

    wie kann ich eine Variable in eine Datenbank speichern? (z.B. Ort in einer Adressdatenbank)

    Nächstes Problem:

    Wie wandle ich eine String-Variable in eine Integer-Variable um, um damit rechnen zu können?

    Vielleicht kann mir ja jemand helfen?

  • #2
    Hallo,
    der DataAdapter hat beim <i>Fill</i>-Aufruf die Ergebnismenge der SELECT-Abfrage im DataSet abgelegt, somit sind bereits alle Werte der Felder der abgefragten Datenbank-Tabelle in objektorientierter Weise in "Variablen" gespeichert - nur dass die "Variable" als Kollektion aufgebaut ist: Die <i>DataTable</i>-Instanz im DataSet hat eine <b>Rows</b>-Kollektion, und jede dort abgelegte <b>Row</b>-Instanz hat eine <b>Columns</b>-Kollektion. Das eigene Programm kann somit direkt auf jedes einzelne Feld gezielt zugreifen. Und da es in ADO.NET keinen Datensatzzeiger gibt, kann jedes Feld im DataSet völlig frei abgefragt oder beschrieben werden. Das folgende Beispiel demonstriert das Prinzip
    <code>
    <font color="#0000FF">Dim</font> aDTCustomer <font color="#0000FF">As</font> <font color="#0000FF">New</font> <font color="#008080">DataTable</font>()
    <font color="#008000">' SelectCommand = SELECT ProductID, ProductName FROM Products</font>
    SqlDataAdapter2.Fill(aDTCustomer)
    <font color="#0000FF">Dim</font> sWert1, sWert2 <font color="#0000FF">As</font> <font color="#0000FF">String</font>
    sWert1 = aDTCustomer.Rows(2)(1).ToString()
    sWert2 = aDTCustomer.Rows(0)(1).ToString()
    <font color="#008080">MessageBox</font>.Show(sWert1 + <font color="#008080">Environment</font>.NewLine + sWert2)
    </code>
    <br>
    &gt;Wie wandle ich eine String-Variable in eine Integer-Variable um?
    Dafür stehen mehrere Wege zur Verfügung. Zum einen die VB-spezifischen Anweisungen, wie zum Beispiel <b>CDec</b>:
    <code>
    Dim dData As Decimal = CDec(TextBox1.Text)
    </code>
    Universeller sind die sprachunabhängigen Klassen aus dem .NET Framework, wie zum Beispiel <b>Convert</b>:
    <code>
    Dim aData As Decimal = Convert.ToDecimal(TextBox1.Text)
    </code&gt

    Comment


    • #3

      Hallo,
      .
      vielen Dank für die schnelle Hilfe. Ich kann jetzt also Datenfelder in Variablen schreiben und auch Variablen in bestehende Datenfelder.
      .
      dbadressen.Rows(0)(0) = name
      OleDbDataAdapter1.Update(dbadressen)
      .
      Nur kann ich leider noch keine zusätzlichen Datenreihen anfügen. Bisher überschreibt mir das Programm die bestehenden Felder.

      &#10

      Comment


      • #4
        Hallo,
        jeder neue Datensatz muss als <b>Row</b>-Instanz der vorhandenen <b>Rows</b>-Kollektion hinzugefügt werden. Die Vorgehensweise hängt davon ob, ob ein <i>typisiertes DataSet</i> oder ein <i>untypisiertes DataSet</i> verwendet wird.
        <br>
        A) Typisiertes DataSet: Beim Anlegen des typisierten DataSets hat Visual Studio automatisch eine Hilfsklasse generiert, die alle Spalten der Tabellen als Eigenschaften kapselt und die spezielle Hilfsmethoeden zum Suchen und Einfügen von neuen Datensätzen implementiert. Zum Beispiel ist die Methode <b>Add<i>MailAdressenRow</i></b> eine derartige Hilfsmethode, die sofort aufgerufen werden kann und bei der die Programmierhilfe von Visual Studio die erwarteten Parameter auflistet:
        <code>
        DataSet11.MailAdressen.AddMailAdressenRow(TextBox2 .Text, TextBox3.Text, TextBox4.Text, CheckBox1.Checked)
        </code>
        C) Untypisiertes DataSet
        <code>
        Dim aNewRow As DataRow
        aNewRow = aNewDataTable.NewRow()
        aNewRow(0) = "Kosch"
        aNewRow(1) = "Andreas"
        aNewRow(2) = 40
        DataSet1.Tables(0).Rows.Add(aNewRow)
        </code&gt

        Comment


        • #5
          Hallo,
          .
          das mit den untypisierten Datensätzen sieht ja ganz gut aus, nur bekomme ich sofort die Fehlermeldung:
          .
          "Spalte 0" nicht gefunden.
          .
          Muss ich trotz dataSet die Datei erst noch öffnen

          Comment


          • #6
            Hallo,
            das folgende Beispiel definiert die Tabellenstruktur erst zur Laufzeit, somit werden die Daten in einer In-Memory-Tabelle gespeichert:
            <code>
            <font color="#008000">' neue DataTable erzeugen</font>
            <font color="#0000FF">Dim</font> aNewDataTable <font color="#0000FF">As</font> <font color="#0000FF">New</font> <font color="#008080">DataTable</font>()
            aNewDataTable.<font color="#008080">Columns</font>.Add("Nachname", <font color="#0000FF">GetType</font>(<font color="#0000FF">String</font>))
            aNewDataTable.<font color="#008080">Columns</font>.Add("Vorname", <font color="#0000FF">GetType</font>(<font color="#0000FF">String</font>))
            aNewDataTable.<font color="#008080">Columns</font>.Add("Alter", <font color="#0000FF">GetType</font>(<font color="#008080">Int32</font>))
            aNewDataTable.PrimaryKey = <font color="#0000FF">New</font> <font color="#008080">DataColumn</font>() {aNewDataTable.<font color="#008080">Columns</font>("Nachname"), aNewDataTable.<font color="#008080">Columns</font>("Vorname")}
            aNewDataTable.MinimumCapacity = 10
            <font color="#008000">' neuen Datensatz eintragen (Variante 1)</font>
            <font color="#0000FF">Dim</font> aNewRow <font color="#0000FF">As</font> <font color="#008080">DataRow</font>
            aNewRow = aNewDataTable.NewRow()
            aNewRow(0) = "Kosch"
            aNewRow(1) = "Andreas"
            aNewRow(2) = 40
            aNewDataTable.Rows.Add(aNewRow)
            <font color="#008000">' neuen Datensatz eintragen (Variante 2)</font>
            aNewDataTable.Rows.Add(<font color="#0000FF">New</font> <font color="#0000FF">Object</font>() {"Mustermann", "Manfred", 50})
            <font color="#008000">' Ergebnis anzeigen</font>
            DataGrid1.DataSource = aNewDataTable
            </code>
            Wenn allerdings das DataSet über die <b>Fill</b>-Methode vom DataAdapter gefüllt wird, liegt dort bereits eine DataTable-Instanz mit der Struktur der ausgelesenen Datenbank-Tabelle vor. In diesem Fall kann über <b>Rows.Add</b> sofort ein neuer Datensatz hinzugefügt werden

            Comment


            • #7
              Hallo,

              vielen Dank, dass Du Dir so viel Mühe mit mir gibst. Aber irgendwie verwirrt mich das noch mehr.
              Ich will ja keine neue Tabelle erzeugen.
              Ich habe eine bestehende, leere Tabelle aus Access. Dort will ich Daten aus einem Array hinkopieren.
              .
              Mit Dataadapter und Dataset habe ich diese Tabelle schon mit der Form verknüpft und lasse mir den (wenn) bestehenden Inhalt in Textfeldern anzeigen. Doch sollen ja neue Daten hinzukommen.
              .
              Ist das wirklich so eine komplizierte Sache oder stelle ich mich einfach nur dumm an

              Comment


              • #8
                Hallo,
                .
                vielen Dank, dass Du Dir soooo viel Mühe mit mir gibst. Nach langen Tests hab ich es endlich geschafft, einen Datensatz an eine bestehende Datei anzuhängen.

                Comment


                • #9
                  Hallo,
                  .
                  ich shon wieder
                  .
                  Ich habe einen Datensatz neu in eine Datenbank kopiert. Gut. Aber ich möchte nun mehrere Datensätze hintereinander erstellen, bekomme aber nach dem ersten eine Fehlermeldung bei DataSet11.zusammen.Rows.Add(anyRow).
                  "Anyrow + 1" geht nicht.
                  .
                  datensatz1 = Me.BindingContext(DataSet11, "zusammen").Count
                  Dim anyRow As DataRow = DataSet11.zusammen.NewRow

                  For i = 0 To linecount - 1

                  anyRow("warengruppe") = zusammenfassung(0, i)
                  anyRow("ursprung") = zusammenfassung(1, i)
                  anyRow("referenz") = zusammenfassung(2, i)
                  anyRow("buchungsmenge") = zusammenfassung(3, i)
                  anyRow("nettopreis") = zusammenfassung(4, i)
                  anyRow("artikelnummer") = zusammenfassung(5, i)
                  anyRow("lieferant") = zusammenfassung(6, i)
                  anyRow("datum") = zusammenfassung(7, i)
                  anyRow("rechnungsnummer") = zusammenfassung(8, i)
                  anyRow("nummer") = datensatz1 + 1
                  DataSet11.zusammen.Rows.Add(anyRow)
                  OleDbDataAdapter1.Update(DataSet11, "zusammen")
                  Next i
                  .
                  Kann mir da jemand helfen

                  Comment


                  • #10
                    Wie sieht denn die Fehlermeldung aus

                    Comment


                    • #11
                      Zusätzliche Informationen: Diese Zeile gehört bereits zu dieser Tabelle

                      Comment


                      • #12
                        Hallo Gerald,

                        Du deklarierst die DataRow vor der Schleife und weist sie in der Schleife mit jeweils neuen Werten mehrmals dem DataSet zu. Ich denke das ist das Problem, da die Row ja immer die gleiche Referenz hat, d.h. dasselbe Objekt ist.
                        Verschiebe das Statement
                        Dim anyRow As DataRow = DataSet11.zusammen.NewRow
                        in die Schleife, so dass immer eine neues Row-Objekt erzeugt wird. Ich denke das sollte helfen.

                        Gruss, Brun

                        Comment


                        • #13
                          Hallo Bruno,

                          herzlichen Dank für Deine Hilfe. Da wäre ich wohl selbst nicht drauf gekommen, dass man eine Deklaration in einer Schleife wiederholen darf.

                          Aber nun funktioniert es.

                          Gruss, Geral

                          Comment

                          Working...
                          X