SqlDataAdapter und MySQL

  • VB.NET
  • .NET (FX) 3.0–3.5

Es gibt 25 Antworten in diesem Thema. Der letzte Beitrag () ist von hirnwunde.

    SqlDataAdapter und MySQL

    Hi Leute,

    liege ich mit meiner Vermutung, dass der SqlDataAdapter aus System.Data.SqlClient nicht für MySQL-Server gedacht ist, richtig?
    Ich versuche mich gerade an diesem Thema und der erste Schuss eine Verbindung mit einem MySQL-Server aufzubauen schlug fehl.
    Netzwerkbezogener oder instanzspezifischer Fehler beim Herstellen einer Verbindung mit SQL Server. Der Server wurde nicht gefunden, oder auf ihn kann nicht zugegriffen werden. Überprüfen Sie, ob der Instanzname richtig ist und ob SQL Server Remoteverbindungen zulässt. (provider: Named Pipes Provider, error: 40 - Verbindung mit SQL Server konnte nicht geöffnet werden)


    Wenn ich den MySqlConnector nutze, kann ich die Funktionen/Methoden von System.Data.SqlClient.DataAdapter 1:1 zum MySql.Data.MySqlClient.MySqlDataAdapter übernehmen?

    Danke! ;)
    ausserdem erben die DbData-Objekte alle von den allgemeinen DbData-Objekten, die in System.Data.Common im Framework enthalten sind. Diese Basisklassen unterstützen noch bischen mehr an Funktionalität wie die IDataBlabla-Interfaces.
    Guck dir die Angelegenheit mal im ObjectBrowser an.

    Nutzen tue ich das in meine DBExtensions - allgemeine Lösung der Daten-Persistierung via Datenbanken - deshalb sind die provider-unabhängig.

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

    ErfinderDesRades schrieb:

    in meine DBExtensions


    Ich hab es mal angelesen und für mich zu hoch eingestuft.
    Vielleicht komm ich da ran, wenn ich in ein, zwei Wochen mehr von der ganzen DataAdapter-Materie verstehe ;)

    Jetzt hadere ich noch mit dem Verständnis des Funktionsprinzips ...

    Wenn ich mittels .Fill() ein DataSet fülle, kann das nur einmalig geschehen - ich kann also nicht zwei Tables in diesem DataSet speichern, oder?

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    2. einserDS.Tables.Clear()
    3. Dim conn1 As New MySqlConnection("Server=192.168.2.168; user=foo; password=bar; database=foobar")
    4. Dim conn2 As New MySqlConnection("Server=192.168.2.254; user=foo; password=bar; database=foobar")
    5. Dim sqlstr1 As String = "SELECT * FROM 3040_messdaten WHERE `ol2` < 200"
    6. Dim sqlstr2 As String = "SELECT * FROM 3040_messdaten WHERE `ol2` < 200"
    7. Dim adapter1 As New MySqlDataAdapter(sqlstr1, conn1)
    8. Dim adapter2 As New MySqlDataAdapter(sqlstr2, conn2)
    9. adapter1.Fill(einserDS)
    10. adapter2.Fill(einserDS)
    11. einserDS.Tables(0).TableName = "einsernewtxl"
    12. einserDS.Tables(1).TableName = "einsertxl"
    13. DataGridView1.DataSource = einserDS.Tables("einsernewtxl")
    14. DataGridView2.DataSource = einserDS.Tables("einsertxl")
    15. End Sub


    Ich fand heraus, dass .Fill() die resultierende Tabelle in dem DataSet mit dem TableName "Table" versieht.
    Da das für's spätere Arbeiten mit dieser Tabelle eher unschön ist, dachte ich, ich benenne die Tabelle nach dem hinzufügen um.
    Das klappte auch, wenn ich nur ein Fill() auf das DataSet mache.
    Beim Versuch, die zweite Tabelle umzubenennen bekam ich eine OutOfRange-Exception, weil augenscheinlich keine zweiter Tabelle in dem DataSet vorhanden sei.
    Also wird von einem Fill() die schon vorhandene Tabelle überschrieben und keine Zweite erstellt, richtig?
    Ich krieg es nicht gebacken, ein Typisiertes DataSet hinzuzufügen, da ich, wenn ich eine Datenquelle hinzufügen möchte, keinen MySQL-Dienstanbieter präsentiert bekomme.

    Habe hier halt nur VS 2010 Express ... da gibt es ja, nachdem ich ein bisschen auf StackExchange und hier im Forum suchte, bekannte Probleme mit, da dies seitens Oracle nicht unterstützt wird.
    Dann bau das typisierte Dataset selbst, im Dataset-Designer.
    Es muss allerdings 100% auf die Datenbank passen.

    Dassis mühsam, aber meinen DbGenerator wirst du ja auch nicht verwenden wollen, weil du den Code nicht verstehst.
    Weil DbGenerator dreht den Spieß um: Nicht mehr das Dataset wird aus der DB generiert, sondern die DB wird aus dem Dataset generiert.
    Ergebnis dasselbe, nur in einem Dataset kann man ein Datenmodell viel besser anlegen als mit den MySql-Murkel-Tools.

    jedenfalls am typisierten Dataset führt mittelfristig doch eh kein Weg vorbei.
    Ohne typisierte Datenklassen eine auch nur leidlich ergonomische Oberfläche erstellen zu wollen - dabei kriegt man dochn Vogel!

    EaranMaleasi schrieb:

    Und was hindert dich daran auf VS 2013 Community zu wechseln?

    Der fehlende Platz auf der System-SSD.
    Habe zwar noch ca 5GB, aber nach dess Installation gerate ich wieder in einen Zustand, bei dem ich alle Nase lang Daten suchen und löschen muss.
    Und Cheffchen wieder eine SSD abluchsen wird schwierig ;)

    ErfinderDesRades schrieb:

    Dann bau das typisierte Dataset selbst

    Gerne!
    Alles, was ich zum typisierten DataSet fnd waren Anleitungen mit dem Designer.
    Eine Beispiel einer programmatische Erstellung dessen muss ich erstmal finden ;)

    ErfinderDesRades schrieb:

    Baus im Designer


    Oh man ... ganz schon umständlicher Weg um erstmal ein typ. DS erstellen zu können.
    Jeztzt mal meine Rückfrage, ob ich das so richtig gemacht habe:
    [Projekt]->[Neues Element hinzufügen] : Dort "DataSet" ausgewählt.
    Dies erzeugte in mienem Projekt eine Datei des Namen "DataSet.xsd"

    Und jetzt konnte ich auch erst ein typ. DataSet (aus der Toolbox heraus) hinzufügen und im Designer Tabellen definieren.


    Bin ich auf dem richtigen Weg?
    ja - ist super!

    Und dieses Datenmodell hast du ebenso auch in der Datenbank?

    tut mir leid - das verstößt gegen grundlegende Regeln der Datenmodellierung.
    Früher oder später wirst du das umbauen müssen, weil so vermurkste Datenmodelle fahren iwann gegen die Wand.

    3030 und 3040 sind ja identisch - sowas gehört dann in eine gemeinsame Tabelle, und man würde eine zusätzliche Spalte machen, die aussagt, ob der Datensatz 3030 ist oder 3040.

    Dasselbe Spiel mit 2121 und 2121C.

    Ich predige ja unablässig, die Datenbank erstmal wegzulassen, und Datenmodellierung und Databinding erstmal ohne zu erlernen, und umzusetzen.
    Nu haste das "Gschiss" - da wirste nun iwann Datenbank und Dataset korrigieren müssen, früher oder später, und früher ist besser als später.

    guggemol "Vorbemerkung" in Daten laden und speichern

    ErfinderDesRades schrieb:

    3030 und 3040 sind ja identisch


    Das ist leider nur die halbe Wahrheit.
    Sie sind vielleicht von den Datenfelden her identisch, aber es sind zwei unterschiedliche Bauteiltypen mit verschiedenen Abmaßen.
    Das gleiche gilt für 2121 und 2121C.

    ErfinderDesRades schrieb:

    Und dieses Datenmodell hast du ebenso auch in der Datenbank?


    Dem ist so.
    Das ist eine 1:1-Übernahme aus meinem MySQL-Schema (nennt man das so?)

    Ich habe das jetzt mal weiter gebastelt:
    Hinzugekommen im Gegensatz zum MySQL-Dingens (Schema? ) sind die Relationships zwischen *_info.TXLCode und *_messdaten.TXLCode und *_rauheiten.TXLCode

    ErfinderDesRades schrieb:

    Ich predige ja unablässig, die Datenbank erstmal wegzulassen


    Nunja ... nicht ganz so einfach in meinem Fall.
    Die Entscheidung, eine Datenbank zu nutzen resultiert aus drei Arbeitsplätzen, die -mitunter auch gleichzeitig- auf die Datensätze zugreifen.
    Sowohl lesend und schreibend.
    Wenn ich das mittels einer XML-Datei gelöst hätte, wäre die Gefahr, das Änderungen wegen zeitlicher Überschneidung von Schreibvorgängen verloren gehen.
    Oder sehe ich das falsch?

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

    hirnwunde schrieb:

    Das ist leider nur die halbe Wahrheit.
    Sie sind vielleicht von den Datenfelden her identisch, aber es sind zwei unterschiedliche Bauteiltypen mit verschiedenen Abmaßen.
    Ja - Datenmodellierung richtig anwenden!
    Es fehlt eine Tabelle BauteilTyp, auf die von MessDaten verwiesen werden kann.
    Damit ein Messdaten-Datensatz seinen BauteilTyp angeben kann.

    Datenverarbeitungs-Vorraussetzungen - Punkt#5 - weil ohne die Theorie geht man inne Praxis unter.
    Ich hab mal eine neue Struktur gemacht.
    Da der Bauteiltyp sich vom (eindeutigen) Feld "TXLCode" ableiten lässt, habe ich mir ein extra Feld für dieses Merklmal gespart.
    Wenn ich jetzt alle vier Bauteiltypen in einer Tabelle vereine, habe ich die Situation, dass ich leere Datenfelde haben werde,
    da nur 3040 und 3030 den kompletten Datensatz füllen, 2121 und 2121C allerdings 6 Merkmale weniger haben.
    Würde das ein Problem darstellen?

    Die (2121/2121C) würden dann beim befüllen die nicht vorhandenen Merkmale auf NULL belassen oder sollten sie einen anderen Wert eintragen?

    Ist das überhaupt sinnvoll, es in einer einzigen Tabelle zu machen?


    Ganz sicher bin ich nicht, ob alle 4 in eine zu packen, möglich ist.
    Da wäre ich vmtl. nichtmal sicher, wenn ich dein Teil komplett selbst entworfen hätte - sowas stellt sich manchmal erst noch im Verlauf heraus.
    Wie gesagt und wie man sieht: Datenmodelle ändern sich während einer Entwicklung immer wieder mal, und deshalb ists keine gute Idee, von Anfang an immer eine DB mit durchschleppen zu wollen.

    Aber wenns dir zunächstmal möglich erscheint, würde ich sehr empfehlen, alle 4 zusammenzufassen, und bei den Spalten, die von bestimmten Bauteilgruppen nicht benutzt werden, Defaultwerte einrichten und AllowDbNull.False festlegen.
    Weil wenn Nullwerte erlaubt sind, muss man bei jedem Zugriff sehr umständlich auf IsDbNull testen - das spart man sich, wenn man sie nicht erlaubt.

    Aber es fehlt immer noch die übergeordnete Tabelle TXLCode, auf die verwiesen wird.
    TXLCode kann nicht einfach eine (String?) Spalte sein, denn es gibt unendlich viele verschiedene Strings.
    In deinem Datenmodell sind aber nur eine sehr endliche Anzahl an TXLCodes zulässig, ich glaube genau 4 Stück, um genau zu sein.
    Nein, das Feld - nein, dessen Wert - ist immer einmalig.

    Ein Beispiel-Code: (zur besseren lesbarkeit darunter eine Zeile mit Bezeichner)

    Quellcode

    1. GR102020222
    2. TTTWWRRSSSS

    Die ersten drei Stellen (TTT) markieren den Bauteiltyp
    Die folgenden Zwei (WW) beschreibt das Werkzeug, auf welches das Bauteil gefertigt wurde
    Die darauf folgenden zwei Stellen (RR) benennen die Revision des Werkzeugs
    Die letzte Vier (SSSS) ist eine fortlaufende Seriennummer des Bauteils

    Somit ist das Feld TXLCode immer eindeutig.
    Es gibt zwar mehrere Bauteile vom Werkzeug 3 mit der Seriennummer 500, und dem Werkzeugrevisionsstand von 2 - aber nur eines vom Bauteiltyp GR1.

    Bist Du da mit mir einer Meinung, dass ich anstatt einer XML-Datei hier auf einer Datenbank angewiesen bin?