Announcement

Collapse
No announcement yet.

mysql connector anstatt odbc

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

  • mysql connector anstatt odbc

    Hi Leute,

    ich bastel sein längerem an einem größeren Projekt unter vb.net in Verbindung mit nem mysql server. Bisher hab ich ODBC Verwendet, da es inzwischen den mysql Connector / Net gibt hab ich angefangen mein Projekt umzuschreiben.

    Ich möchte die Daten aus der mysql Tabelle in ein mehrdimensionales Array schreiben um diese Datensätze später einzeln ansprechen und an lbl und combos auszugeben. Im Inet lese ich überall von Datagrids. Allerdings würde ich das ganze gerne ohne Grid lösen. Was früher mit

    Code:
    da = New Odbc.OdbcDataAdapter("Select id, anrede, ..... From kunden as K LEFT OUTER JOIN orte as O ON K.ortsid=O.ortsid", Connection)
    da.Fill(ds)
    
    frm_Kunden.lbl_id.Text = ds.Tables(0).Rows(i).Item("id").ToString
    funktionierte hab ich wie folgt versucht:

    Code:
    SQL = "Select id, anrede, ... FROM kunden where `deleted` = 0"
    
    myCommand.CommandText = SQL
    myReader = myCommand.ExecuteReader
    myReader.Read()
    Dim total_entries As Integer = 12
    Dim i As Integer = 0
    For Each item In myReader
        Kunden(i, 0) = myReader.GetValue(0)
        [...]
        i = i+1
    Next
    Anstatt total_entries und i++ wird hinterher wieder nen RowCount eingefügt.

    Das Problem ist momentan, dass die Datensätze nicht richtig in das Array geschrieben werden. Momentan wird aus unbekanntem Grund der erste Datensatz weggelassen, obwohl er das Array mit 0,0 beginng. Irgendwo scheint mir myReader nen Streich zu spielen.
    Wie würdet ihr eine solche umsetzung machen?

    Erreicht werden soll, dass die Datenbank in einem Array LOCAL zwischengelagert wird und mit Hilfe eines Form durchsucht oder durch geklickt werden kann ohne jedes mal erneute Anfragen zum Server zu senden.

    Würde mich freuen ein paar Tipps, Tricks / Lösungsvorschläge zu erhalten.

  • #2
    Ich würde unverändert mit DbDataAdapter und DataSet/DataTable arbeiten:
    Code:
    da = New MySqlDataAdapter(
        "Select id, anrede, ..... From kunden as K 
        LEFT OUTER JOIN orte as O ON K.ortsid=O.ortsid", 
        Connection)
    da.Fill(ds, "Kunden")
    Alle MySql-Klassen arbeiten fast identisch wie andere Db-Klassen.

    Dein Problem mit dem DataReader liegt darin, dass der erste Aufruf myReader.Read() den Zeiger bereits auf den zweiten Datensatz gelegt hat. Eine übliche Vorgehensweise dabei lautet nämlich (in Pseudo-Code):
    Code:
    while(not myReader.Read())
       //  den aktuellen Datensatz übernehmen
    end while
    Gruß Jürgen

    Comment


    • #3
      Das klingt schon mal nach nem Anfang, wir haben das damals allerdings umgebaut weil wir Probleme damit hatten. Ich hab auch noch keine Seite gefunden wo die einzelnen Schritte ähnlich einem Tutorial beschrieben werden.

      Kennt jemand nen gutes Buch, Zeitschrift oder Seite zum Thema VB.net & mysql?

      Bei
      Code:
      de.Fill(ds, "Kunden")
      erhalte ich ein
      HTML Code:
      <strong>ConstraintException wurde nicht behandelt.</strong><br />
      Einschränkungen konnten nicht aktiviert werden. Mindestens eine Zeile enthält Werte die die Einschränkungen non-null, unique or foreign-key verletzen.

      Man kann zwar die Exception überprüfung für das Fill ausschalten dies kann sich jedoch gefährlich auswirken.





      Code:
      Public Function SelectKunden()
              ds = New DataSet
              dt = New DataTable
              da = New MySql.Data.MySqlClient.MySqlDataAdapter("Select id, anrede, name, vorname, telefon, email, strasse, eintritt From kunden where `deleted` = 0", verbindung)
              da.Fill(ds, "Kunden")
      
              total_entries = (ds.Tables(0).Rows.Count)
      
              ReDim Kunden(total_entries, 9)
              For i As Integer = 0 To total_entries - 1
                  Kunden(i, 0) = ds.Tables(0).Rows(i).Item("id").ToString
                  Kunden(i, 1) = ds.Tables(0).Rows(i).Item("anrede").ToString()
                  Kunden(i, 2) = ds.Tables(0).Rows(i).Item("name").ToString
                  Kunden(i, 3) = ds.Tables(0).Rows(i).Item("vorname").ToString
                  Kunden(i, 4) = ds.Tables(0).Rows(i).Item("telefon").ToString
                  Kunden(i, 5) = ds.Tables(0).Rows(i).Item("email").ToString
                  Kunden(i, 6) = ds.Tables(0).Rows(i).Item("strasse").ToString
                  Kunden(i, 7) = ds.Tables(0).Rows(i).Item("eintritt").ToString
                  Kunden(i, 8) = ds.Tables(0).Rows(i).Item("ortsname").ToString
                  Kunden(i, 9) = ds.Tables(0).Rows(i).Item("plz").ToString
              Next
      
              Return Kunden
      End Function

      Comment


      • #4
        Hallo,

        die Exception sieht so aus, dass durch einen ersten Lese-Vorgang bereits Daten in die DataTable eingelesen wurden und jetzt "nochmals" alle Daten geholt werden. Das verletzt natürlich die Eindeutigkeitsbedingung des PrimaryKey in der Spalte ID. Wenn das der Fall ist, muss natürlich vorher ds.Tables["Kunden"].Clear() aufgerufen werden.

        Andererseits sehe ich bei Dir keine Deklaration des DataSet, nur einen Konstruktor. Außerdem gibt es ein einsames "dt = new DataTable", ohne dass diese DataTable nochmals benutzt wird. Das DataSet (und ggf. eine oder mehrere DataTables) werden einmalig in der Anwendung oder in einem Formular erstellt und später mit Daten gefüllt und verarbeitet. Es ist fast immer Quatsch, bei jedem "SelectKunden" ein neues DataSet zu erzeugen.

        Ich verstehe überhaupt nicht, warum Du unbedingt mit einem Array arbeiten willst. Die DataTable entspricht doch "von Natur aus" der DB-Tabelle viel besser; und wenn Du ein typisiertes DataSet verwendest, hast Du auch einen typsicheren Zugriff auf die einzelnen Spalten/Felder. Mir wird immer schlecht, wenn ich lese, dass ein Eintrittsdatum nicht als DateTime, sondern als String verarbeitet werden soll.

        Als Lektüre kannst Du (je nach Version) das OpenBook Einstieg VB 2008 mit Kap. 8 oder OpenBook VB 2005 mit Kap.26 verwenden. Anstelle der Sql-Klassen nimmst Du einfach Deine MySql-Klassen; dies sind fast identisch zu verwenden.

        Jürgen

        Comment


        • #5
          Danke Jürgen,

          du hast mir schon einigermassen weiterhelfen können. An das Openbook hab ich scho gar nimmer gedacht, weil darin so gut wie nichts über odbc zu finden ist hab ich es irgendwann "bei seite gelegt"

          bezüglich dem eintrittsdatum, das wird bei der ausgabe wieder convertiert =)
          Code:
          Dim eintritt As Date = Kunden(i, 7)
          frm_Kunden.txt_eintritt.Text = eintritt
          weiss jetz auf anhieb gar nicht mehr wieso wir das so umständlich gemacht haben.

          Dein ds.Tables("Kunden").Clear() hat irgendwie nicht den erwünschten erfolg gebracht, anhand deiner fehlerbeschreibung hab ich auch die auslösung gefunden. Im Serverbrowser steht / stand die Datenbankverbindung ebenfalls bereits drin. Wenn ich jetz

          da.Fill(ds, "Kunden2")

          schreibe bricht er zumindest nicht mehr ab, ein Array würde ich nur deshalb bevorzugen, damit ich nicht den ganzen code umschreiben muss. Es sind inzwsichen schon eine Hand voll Module die alle auf dem Array bassieren.

          Somit bräuchte ich einmal im programm ein
          dataset --> array
          während der laufzeit kann ich dann mit dem array arbeiten, wenn daten zurückgeschrieben werden geschieht das ohne dataset
          per direkten
          command.execute --> mysql instert

          Comment


          • #6
            Also wenn Du schon (hoffentlich nur vorläufig) bei dem Mist mit dem Array bleiben willst, dann geht das "Kopieren" so, wie Du es schon vorbereitet hast, wobei ich etwas weniger Schreibarbeit bevorzuge:
            Code:
                dt = ds.Tables("Kunden2")
                ReDim Kunden(total_entries, 9)
                For i As Integer = 0 To total_entries - 1
                        Kunden(i, 0) = dt.Rows(i).Item("id").ToString
                        Kunden(i, 1) = dt.Rows(i).Item("anrede").ToString()
                        //  usw.
                Next
            Für eine solche Übertragung wäre eine ForEach-Schleife einfacher und besser; aber bei einem Array kommt es natürlich auf den Index an.

            Aber ich bleibe bei der dringenden Empfehlung: "Echte", passende Datenstrukturen verwenden. Jürgen

            Comment


            • #7
              Also nachdem du den Mist nicht magst =) werd ich wohl den Code mal noch überarbeiten, denn die DataTable ist schließlich Public und daher sollte ich jederzeit auf die Daten zugreifen können ohne mein Kunden Array zu verwenden.

              Jetzt verstehe auch was es mit dem
              Code:
              da.Fill(ds, "Kunde")
              auf sich hat, bisher hab ich "Kunde" nicht mit angegeben. Dieser ist als Bezeichner gedacht wenn ich mehrere Tabellen an das Dataset übergebe.

              Laut Studio sollte doch nach dem Komma die SRCTable angegeben werden dabei ist die Bezeichnung SRC Table etwas wage gewählt.

              Code:
              da = New MySql.Data.MySqlClient.MySqlDataAdapter("Select id, anrede, name, vorname, telefon, email, strasse, eintritt, ortsname, plz From kunden as K LEFT OUTER JOIN orte as O ON K.ortsid=O.ortsid where `deleted` = 0", verbindung)
              ds.Tables("kunden").Clear()
                      
              da.Fill(ds, "kunden2")
              dt = ds.Tables("kunden2")
              
              total_entries = (ds.Tables("kunden2").Rows.Count)
              
              ReDim Kunden(total_entries, 9)
              For i As Integer = 0 To total_entries - 1
                      frm_Datenbank.ListBox1.Items.Add(dt.Rows(i).Item("name").ToString)
              Next
              Funktioniert fehlerfrei ich war nur verwirrt das kunden einen Fehler ausgeworfen hat. Dies lag daran, dass die Tabelle in mysql Kunden heisst und er daher den Bezeichner verweigert.
              Zuletzt editiert von hubabubahuba; 22.05.2008, 17:09. Reason: Änderung :)

              Comment

              Working...
              X