mysql_insert_id bei typisiertem DataSet?

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 81 Antworten in diesem Thema. Der letzte Beitrag () ist von 100Volt.

    Zum laden einer Tabelle: Dts.tblKunden.CustomFill("")
    Zum laden aller Tabellen: Dts._Persistance.FillAll()


    Ich schrieb bzw. sagte doch, daß ich es in der XML-Variante weitermache, nachdem ich weiß, ob und wie es im Detail funktioniert. Ich halte es dem eigenem Vorhaben gegenüber für grob fahrlässig, einfach hunderte Stunden Arbeit zu investieren, weil es gehen soll, man aber bereits merkt, daß es im Detail doch nicht ganz so ist. Die Erkenntnisse von heute verhindern die Baustellen von morgen. Der letzte Satz klingt so gut, den muß ich eigentlich als Signatur verwenden :)


    ------------------------ NACHTRAG ------------------------

    Wie bekomme ich nach dem Ändern der Daten in einer DataRow diese wieder in die Tabelle?

    So Dts.tblKunden.Rows(0).Item(Dts.tblKunden.VornameColumn) = strVorname soll ich es ja nicht machen (Post #41), stattdessen so:

    VB.NET-Quellcode

    1. dim rwKunde = Dts.tblKunden.Rows(0)
    2. rwKunde.Vorname = strVorname
    3. rwKunde.Nachname = strNachname


    Mit Dts.tblKunden.AddtblKundenRow würde ich die DataRow als zusätzlichen Datensatz anfügen. Ich möchte aber nur den Datensatz verändern. Löschen und dann neu hinzufügen? Eher nicht, denn dann würde sich vermutlich der Primärschlüssel (autoincrement) ändern. Aber wie dann?


    ------------------------ NACHTRAG 2 ------------------------

    Zum Problem in Post #56 und den Lösungsvorschlag in Post #58:
    _DataSetXML = True zu setzen bringt nichts. Zumindest dann nicht, wenn keine XML-Datei vorhanden ist.

    --------
    Lieber inkompetent als inkontinent

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „100Volt“ ()

    100Volt schrieb:

    _DataSetXML = True zu setzen bringt nichts. Zumindest dann nicht, wenn keine XML-Datei vorhanden ist.

    Das sollte irgendwie logisch sein oder? Also mit _DataSetXML = True sagst du deinem Programm ja, dass es XML nutzen soll. Wenn keine Datei da ist kann er auch keine benutzen.. also für mich ist das logisch :D

    100Volt schrieb:

    Wie bekomme ich nach dem Ändern der Daten in einer DataRow diese wieder in die Tabelle?

    Änderst du nicht über die GUI in einem Dialog?

    Du kannst Werte auch über Code setzen, allerdings wäre .Rows(0) ja immer die erste Row in der Tabelle.
    Wenn du das so machen würdest, wie ich dir gezeigt habe ging das automatisch in einem Dialog. Oder manuell kannst
    dir die korrekte Row über Bindingsource.At(Of Tabellerow) ziehen - oder du musst ganz umständlich über Linq gehen
    und die Row nach deinen Wünschen suchen:

    Dim rw = Dts.TABELLENNAME.FirstOrDefault(Function(x)x. BEDINGUNG) oder mehrere
    Dim rwS = Dts.TABELLENNAME.Where(Function(x)x. BEDINGUNG)
    etc...

    EDIT: Achja, in jedem Fall musst du Dts.save machen - dann erscheinen deine Änderungen auch in der Tabelle
    EDIT2: irgendwie hast du dir die Beispiele scheinbar auch nicht angeschaut. Wir hatten doch 2 Fälle zusammen gemacht:

    Anrede und Kunden. Da gibt's eine Form mit DGV (anzeige aller Daten) und jeweils einen Detail-Dialog zum Editieren / Neuanlegen. Warum wurschtelst du dann wieder so im Code
    rum? Dein Beispiel

    VB.NET-Quellcode

    1. dim rwKunde = Dts.tblKunden.Rows(0)
    2. rwKunde.Vorname = strVorname
    3. rwKunde.Nachname = strNachname


    sieht mir danach aus als hättest du Textboxen ohne Binding auf deiner Form und versuchst darüber deine Daten zu editieren - was Quatsch ist wenn du mit DataSet arbeitest,
    dafür gibt's Databinding und die Bindingsource

    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „tragl“ ()

    Das sollte irgendwie logisch sein oder? Also mit _DataSetXML = True
    sagst du deinem Programm ja, dass es XML nutzen soll. Wenn keine Datei
    da ist kann er auch keine benutzen.. also für mich ist das logisch


    Nein, denn das Problem (Post #56) ist:
    Nun gibt es ein neues Problem. Ich kann nicht mehr auf mein DataSet
    zugreifen um mit meinem Code die Tabellen in der Datenbank zu erstellen.
    Der Aufruf von Dts.Register(Me, False)
    führt im weiteren Verlauf offenbar zur Kommunikation mit dem
    Datenbankserver, auf dem die Tabellen des DataSets dann nicht vorhanden
    sind.


    Der Lösungsvorschlag aus Post #58:
    Jo du musst ja auch auf der frmMain das _DataSetXML = True setzen - dann kommuniziert der auch net mehr mit der DB. Dann kannste deine Tabellen da wieder anlegen lassen


    Ich kann kann auf das DataSet nicht mehr direkt zugreifen. Das ist jetzt irgendwie in einer Klasse und beim Zugriff auf diese wird zur Initialisierung etlicher Code ausgeführt.

    _DataSetXML = False funzt nicht, weil die Tabellen in der DB noch nicht existieren
    _DataSetXML = True funzt nicht, weil es noch keine XML-Datei gibt.

    Guter Code muß sich doch sozusagen selbst "helfen" können. Wenn es etwas nicht gibt, das aber benötigt wird, dann muß es erstellt werden. Zumindest habe ich das bislang immer so gehandhabt.
    Wie ist denn hier der vorgesehene Weg?

    ----------------------Thema 2 (Modifikation eines Datensatzes) ----------------------

    Änderst du nicht über die GUI in einem Dialog?


    An vielen Stellen nicht, das hatte ich auch immer wieder versucht zu erklären. Es passieren in meinem Programm etliche Sachen quasi im Hintergrund. Dann muß ich einen Datensatz laden, ändern und speichern. Ich finde nicht, daß das rumwurschteln ist. Rumwurschteln wäre es eher, einen Dialog zu benutzen und die Eingaben (Tastendrücke) zu simulieren.

    Die einzige Möglichkeit (die (getestet) auch funktioniert), ist diese:
    Dts.tblKunden.Rows(0).Item(Dts.tblKunden.VornameColumn) = strVorname
    Soll ich (Post #41) aber nicht so machen, sondern die DataRow rausholen und daran arbeiten. Nur wie bekomme ich die modifizierte DataRow "zurück" in die Tabelle?
    --------
    Lieber inkompetent als inkontinent

    100Volt schrieb:

    Nur wie bekomme ich die modifizierte DataRow "zurück" in die Tabelle?

    indem du speicherst. Wir können uns das heute abend nochmal angucken. Dann bring ich dir XML an's Laufen und zeig dir das mit den Rows.
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:
    sry - ich verstehe das Problem anders, und wie ichs verstehe, hats mit Speichern nix zu tun.

    Also:

    100Volt schrieb:

    Die einzige Möglichkeit (die (getestet) auch funktioniert), ist diese:
    Dts.tblKunden.Rows(0).Item(Dts.tblKunden.VornameColumn) = strVorname
    Soll ich (Post #41) aber nicht so machen
    richtig - solltest du nicht machen. Sondern solltest du so machen, wie in post#41 gezeigt:

    VB.NET-Quellcode

    1. dim rwKunde = Dts.tblKunden(0)
    2. rwKunde.Vorname = strVorname
    Einfach machen - und testen.
    Weil wenn das hier funktioniert:

    VB.NET-Quellcode

    1. Dts.tblKunden.Rows(0).Item(Dts.tblKunden.VornameColumn) = strVorname
    Dann funktioniert auch das:

    VB.NET-Quellcode

    1. Dts.tblKunden(0).Vorname = strVorname
    Und das:

    VB.NET-Quellcode

    1. dim rwKunde = Dts.tblKunden(0)
    2. rwKunde.Vorname = strVorname


    100Volt schrieb:


    ..., sondern die DataRow rausholen und daran arbeiten. Nur wie bekomme ich die modifizierte DataRow "zurück" in die Tabelle?
    Das hat mit rausholen in dem Sinne, dass es dann nicht mehr da ist, wo es vorher war, nix zu tun.
    Daher muss man auch nix modifiziertes wieder "zurücktun".

    Aber das müsstest du doch erlebt haben, wenn du es überhaupt mal ausprobiert hättest.

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

    indem du speicherst.

    Das würde nur funktionieren, wenn ich es so mache (Dts.tblKunden.Rows(0).Item(Dts.tblKunden.VornameColumn) = strVorname), wie ich es nicht machen soll.

    Die so rowKunden = Dts.tblKunden.Rows(0) erzeugte DataRow ist offenbar eine Kopie und kein Verweis. Zumindest haben Änderungen daran keinen Einfluß auf die Tabelle. Wenn Du mit "speichern" Dts.SaveDts() meinst, dann geht das so jedenfalls nicht.

    Heute Abend paßt. Vielen Dank schon mal!


    @EdR:
    Habe Deinen Post erst nach dem Absenden dieses Posts gesehen. Gleich mehr dazu... :)


    ------------------------- NACHTRAG -------------------------

    So, frisch getestet:

    Das hier geht:

    VB.NET-Quellcode

    1. Dts.tblKunden(0).Vorname = strVorname
    2. Dts.SaveDts()



    Das geht nicht:

    VB.NET-Quellcode

    1. dim rwKunde = Dts.tblKunden(0)
    2. rwKunde.Vorname = strVorname
    3. Dts.SaveDts()



    Das hat mit rausholen in dem Sinne, dass es dann nicht mehr da ist, wo es vorher war, nix zu tun.
    Daher muss man auch nix modifiziertes wieder "zurücktun".

    So meinte ich das auch nicht. Sorry, falsch formuliert. Rausholen war im Sinne von sichtbar machen / verwenden gemeint.

    Die zweite Variante (mit der DataRow) funktioniert zumindest bei mir nur zum Lesen, da rwKunde nur eine Kopie der DataRow in der Tabelle zu sein scheint und kein Verweis darauf.


    wenn du es überhaupt mal ausprobiert hättest

    Ich arbeite seit Wochen an dem Thema, bin langsam echt verzweifelt, und suche hier nicht zum Spaß Hilfe, nur um meine lieben Mitmenschen zu beschäftigen. Deshalb probiere ich die Vorschläge selbstverständlich auch aus, gucke mit Tutorials an usw.
    Sonst könnte ich ja gleich irgendwo inserieren: "Suche Philanthrop*innen/Blödmann*innen, der/sie/es mir mein Projekt programmiert" ;)


    --------
    Lieber inkompetent als inkontinent

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

    100Volt schrieb:

    Das hier geht:

    VB.NET-Quellcode

    1. Dts.tblKunden(0).Vorname = strVorname
    2. Dts.SaveDts()


    Das geht nicht:

    VB.NET-Quellcode

    1. dim rwKunde = Dts.tblKunden(0)
    2. rwKunde.Vorname = strVorname
    3. Dts.SaveDts()
    Da bin ich bass erstaunt, weil in dem vb.net, was ich kenne, müsste rwKunde und Dts.tblKunden(0) ein und dasselbe Objekt sein.
    Also so wie wenn ich sage:

    Quellcode

    1. Ich gebe Sarahs ältester Tochter ein Gummibärchen.
    dasselbe ist wie

    Quellcode

    1. Sarahs älteste Tochter ist Lola.
    2. Ich gebe Lola ein Gummibärchen.


    Probier bitte noch:

    VB.NET-Quellcode

    1. dim rwKunde = Dts.tblKunden(0)
    2. Messagebox.Show($"rwKunde Is Dts.tblKunden(0): {rwKunde Is Dts.tblKunden(0)}")
    Ich erwarte, dass "rwKunde Is Dts.tblKunden(0): True" angezeigt wird.

    Oder probier:

    VB.NET-Quellcode

    1. Dts.tblKunden(0).Vorname = "Sarah"
    2. dim rwKunde = Dts.tblKunden(0)
    3. rwKunde.Vorname = "Lola"
    4. Messagebox.Show($"rwKunde heisst: {rwKunde.Vorname}")
    5. Messagebox.Show($"Dts.tblKunden(0) heisst: {Dts.tblKunden(0).Vorname}")
    Ich erwarte, dass beide Messageboxen "Lola" anzeigen, weil sie den Vornamen desselben Datensatzes ausgeben, und "Lola" ist als letztes zugewiesen worden.

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

    Ja, True und Lola, wie es sein soll. Komisch, ich weiß absolut nicht, was ich jetzt anders gemacht habe als vorher. Hauptsache es geht :)
    Danke!!

    Zwei Probleme gibt es nun noch:

    1.
    Ich benötige zum Erstellen der Tabellen in der Datenbank Zugriff auf mein DataSet (Mein Tabellen-erstellen-Code braucht das DataSet). Den "direkten" Zugriff habe ich nicht mehr, da es irgendwie eingebettet/gekapselt oder wie auch immer ist. Ich kann nur noch mit dsMain.Dts darauf zugreifen, allerdings wird dann jede Menge Helpers-Code ausgeführt, der DataAdapter usw. erstellen will. Das führt dann zu einem Fehler, da es noch keine Tabellen in der Datenbank gibt, sie aber offensichtlich erwartet werden.

    Wie kann ich den entweder direkt auf mein DataSet zugreifen oder per Code die Tabellen und Realationen in der Datenbank erstellen (vielleicht schon Bestandteil des Helpers)?


    2.
    Wenn ich den XML-Modus Dts.Register(Me, False).DataFile("..\..\Daten\dsMain.xml").Fill verwenden möchte, und es keine gültige XML-Datei (also entweder Datei nicht vorhanden oder leer) gibt, versucht der Code die Datenbankvariante. Wenn dann die Tabellen in der Datenbank nicht existieren, endet es im Fehler.
    Was ich hier nicht so ganz gelungen finde, ist, daß offenbar das angehängte .DataFile("..\..\Daten\dsMain.xml").Fill über den Modus (XML oder DB) entscheidet, der Modus also implizit festgelegt wird. Vielleicht ist das aber auch so gewollt und Bestandteil eines Features, das mir einfach noch nicht bewußt ist.


    EdR, es wäre toll, wenn Du mir hier weiterhelfen würdest. Punkt 1 ist der wichtigerere, da ich die XML-Variante nicht unbedingt benötige.
    --------
    Lieber inkompetent als inkontinent
    und wie kommen sie dann bei Dir in die Datenbank?

    Bei mir läuft es so, daß ich mir eine Funktion geschrieben habe, die aus dem DataSet alle Tabellen mit ihren Eigenschaftten (und Relationen) ausliest und in der Datenbank entsprechend erstellt.
    --------
    Lieber inkompetent als inkontinent
    Ja, da habich ein Tool für geschrieben - toll, dass du das auch gebastelt hast.

    Also fürs Anlegen von DB-Tabellen brauchst du ja nur eine leere typDataset-Instanz - ohne Inhalt oder Registrierung:

    VB.NET-Quellcode

    1. dim theDataset = new <DatasetNamespace>.<DatasetName>
    2. GeneriereDBTabellen(theDataset)

    Ich hab hier zB grad eine LogistikTool-Anwendung offen, da sähe das konkret so aus:

    VB.NET-Quellcode

    1. Dim theDataset = New Logistik_Tool.dtsLogistik
    2. GeneriereDBTabellen(theDataset)

    Nee, geht nicht:

    VB.NET-Quellcode

    1. dim theDataset = new <DatasetNamespace>.<DatasetName>
    2. GeneriereDBTabellen(theDataset)


    Es wird beim Ansprechen von <DatasetNamespace>.<DatasetName> der Helpers-Code aufgerufen und es kommt zum Fehler, weil die Tabellen in der DB nicht existieren.
    --------
    Lieber inkompetent als inkontinent
    kannst du die Methode zeigen, die da aufgerufen wird?
    Und in den Helpers kann die eiglich nicht drin sein.

    ach, und bitte auch zeigen, wie du das konkret umsetzt, also bei

    VB.NET-Quellcode

    1. dim theDataset = new <DatasetNamespace>.<DatasetName>
    wirklich deinen Namespace und deinen DatasetNamen einsetzen - sodasses kompiliert.
    Aufruf so:

    VB.NET-Quellcode

    1. Dim theDataset = New MeinProjekt.dsMain
    2. SQL_DatenbankEinrichten(theDataset)


    Dann gehts nach dsMain.Logic.vb:

    VB.NET-Quellcode

    1. Shared Sub New()
    2. Dim server = My.Settings.DB_Server
    3. Dim UID = My.Settings.DB_Benutzer
    4. Dim passwd = My.Settings.DB_Passwort
    5. Dim db = My.Settings.DB_Name
    6. Dts = New dsMain
    7. Dts.Persist(False, Dts.Tables.Cast(Of DataTable).Where(Function(tb) tb.PrimaryKey.Length = 0).ToArray) 'Tabellen ohne PrimKey-Column aus Persistierung rausnehmen
    8. Dts._sCon = $"Server={server}; UID={UID}; password={passwd}; Initial Catalog={db};"
    9. 'Dts._sCon = modZentraleAufgaben.GetConnectionString
    10. Dts._Persistance = New MySqlServerPersistance(Dts._sCon, Dts)
    11. Dts._Persistance.Connection_EnterOpen()
    12. 'Try
    13. ' Dts._Persistance.Connection_EnterOpen()
    14. ' MsgBox("MySQL Verbindung OK")
    15. 'Catch ex As Exception
    16. ' MsgBox(ex.Message)
    17. 'End Try
    18. End Sub
    --------
    Lieber inkompetent als inkontinent
    Also ich habe es jetzt ganz individuell für mein Projekt so gelöst:

    Aufruf beim Anwendungsstart (mit Startparameter, Tastendruck oder so - muß ich noch machen):

    VB.NET-Quellcode

    1. modZentraleAufgaben.NurTabellenErstellen(Me, True)


    Das wird dann aufgerufen:

    VB.NET-Quellcode

    1. Module modZentraleAufgaben
    2. Friend bolNurTabellenAnlegen As Boolean
    3. Friend Function NurTabellenErstellen(ByVal frm As Form, ByVal DanachBeenden As Boolean) As Boolean
    4. bolNurTabellenAnlegen = True
    5. Dim theDataset = New xxx.dsMain
    6. SQL_DatenbankEinrichten(frm, theDataset)
    7. If DanachBeenden = True Then End
    8. Return True
    9. End Function
    10. Private Function SQL_DatenbankEinrichten(ByVal frm As Form, ByVal ds As DataSet) As Integer
    11. If Not MsgBox("Jetzt Datenbank einrichten?", CType(vbYesNo + vbQuestion, Global.Microsoft.VisualBasic.MsgBoxStyle)) = vbYes Then Return -1
    12. frm.Cursor = Cursors.WaitCursor
    13. Dim myConn As New MySql.Data.MySqlClient.MySqlConnection()
    14. myConn = New MySql.Data.MySqlClient.MySqlConnection(modZentraleAufgaben.GetConnectionString)
    15. modZentraleAufgaben.SQL_TabelleErstellenAlle(ds, myConn)
    16. frm.Cursor = Cursors.Default
    17. MsgBox("Datenbankeinrichtung erfolgreich", CType(vbOKOnly + vbInformation, Global.Microsoft.VisualBasic.MsgBoxStyle))
    18. Return 0
    19. End Function
    20. '..........
    21. End Module


    Das ist der Code in dsMain.Logic.vb:

    VB.NET-Quellcode

    1. Shared Sub New()
    2. Dts = New dsMain
    3. If modZentraleAufgaben.bolNurTabellenAnlegen = False Then
    4. Dts.Persist(False, Dts.Tables.Cast(Of DataTable).Where(Function(tb) tb.PrimaryKey.Length = 0).ToArray) 'Tabellen ohne PrimKey-Column aus Persistierung rausnehmen
    5. Dts._sCon = modZentraleAufgaben.GetConnectionString
    6. Dts._Persistance = New MySqlServerPersistance(Dts._sCon, Dts)
    7. Dts._Persistance.Connection_EnterOpen()
    8. 'Try
    9. ' Dts._Persistance.Connection_EnterOpen()
    10. ' MsgBox("MySQL Verbindung OK")
    11. 'Catch ex As Exception
    12. ' MsgBox(ex.Message)
    13. 'End Try
    14. End If
    15. End Sub


    Die drei Funktionen, die die Tabellen letztlich erstellen sind diese:

    VB.NET-Quellcode

    1. Module modZentraleAufgaben
    2. Private Function Get_mySQL_CreateString(ByVal dc As DataColumn) As String
    3. Dim strbld As New System.Text.StringBuilder(100)
    4. strbld.Append(dc.ColumnName & " ")
    5. Select Case dc.DataType
    6. Case System.Type.GetType("System.String")
    7. strbld.Append("VARCHAR")
    8. strbld.Append("(" & dc.MaxLength.ToString & ")")
    9. Case System.Type.GetType("System.Char")
    10. strbld.Append("CHAR")
    11. strbld.Append("(" & dc.MaxLength.ToString & ")")
    12. Case System.Type.GetType("System.Boolean")
    13. strbld.Append("BOOLEAN")
    14. Case System.Type.GetType("System.DateTime")
    15. strbld.Append("DATETIME")
    16. Case System.Type.GetType("System.Decimal")
    17. strbld.Append("DECIMAL")
    18. Case System.Type.GetType("System.Double")
    19. strbld.Append("DOUBLE")
    20. Case System.Type.GetType("System.Single")
    21. strbld.Append("FLOAT")
    22. Case System.Type.GetType("System.Int32")
    23. strbld.Append("INT")
    24. Case System.Type.GetType("System.Int16")
    25. strbld.Append("SMALLINT")
    26. Case System.Type.GetType("System.Int64")
    27. strbld.Append("BIGINT")
    28. Case Else
    29. Error 815
    30. End Select
    31. Select Case dc.DataType
    32. Case System.Type.GetType("System.String"), System.Type.GetType("System.Char")
    33. If dc.AllowDBNull = False Then
    34. strbld.Append(" NOT NULL")
    35. If dc.Unique = True Then strbld.Append(" UNIQUE KEY")
    36. Else
    37. If dc.Unique = True Then
    38. strbld.Append(" UNIQUE KEY")
    39. Else
    40. If IsNothing(dc.DefaultValue) = False Then
    41. If dc.DefaultValue.ToString.Length > 0 Then strbld.Append(" default " & dc.DefaultValue.ToString)
    42. End If
    43. End If
    44. End If
    45. Case System.Type.GetType("System.Boolean")
    46. If dc.AllowDBNull = False Then
    47. strbld.Append(" NOT NULL")
    48. Else
    49. If IsNothing(dc.DefaultValue) = False Then
    50. If dc.DefaultValue.ToString.Length > 0 Then strbld.Append(" default " & dc.DefaultValue.ToString)
    51. End If
    52. End If
    53. Case System.Type.GetType("System.DateTime")
    54. If dc.AllowDBNull = False Then
    55. strbld.Append(" NOT NULL")
    56. If dc.Unique = True Then strbld.Append(" UNIQUE KEY")
    57. Else
    58. If dc.Unique = True Then
    59. strbld.Append(" UNIQUE KEY")
    60. Else
    61. If IsNothing(dc.DefaultValue) = False Then
    62. If dc.DefaultValue.ToString.Length > 0 Then strbld.Append(" default " & dc.DefaultValue.ToString)
    63. End If
    64. End If
    65. End If
    66. Case System.Type.GetType("System.Decimal"), System.Type.GetType("System.Single"), System.Type.GetType("System.Double")
    67. If dc.AllowDBNull = False Then
    68. strbld.Append(" NOT NULL")
    69. If dc.Unique = True Then strbld.Append(" UNIQUE KEY")
    70. Else
    71. If dc.Unique = True Then
    72. strbld.Append(" UNIQUE KEY")
    73. Else
    74. If IsNothing(dc.DefaultValue) = False Then
    75. If dc.DefaultValue.ToString.Length > 0 Then strbld.Append(" default " & dc.DefaultValue.ToString)
    76. End If
    77. End If
    78. End If
    79. Case System.Type.GetType("System.Int16"), System.Type.GetType("System.Int32"), System.Type.GetType("System.Int64")
    80. If dc.AutoIncrement = True Then
    81. strbld.Append(" AUTO_INCREMENT")
    82. If dc.AllowDBNull = False Then strbld.Append(" NOT NULL")
    83. Else
    84. If dc.AllowDBNull = False Then
    85. strbld.Append(" NOT NULL")
    86. Else
    87. If dc.Unique = True Then
    88. strbld.Append(" UNIQUE KEY")
    89. Else
    90. If IsNothing(dc.DefaultValue) = False Then
    91. If dc.DefaultValue.ToString.Length > 0 Then strbld.Append(" default " & dc.DefaultValue.ToString)
    92. End If
    93. End If
    94. End If
    95. End If
    96. Case Else
    97. Error 816
    98. End Select
    99. Return strbld.ToString
    100. End Function
    101. Private Function SQL_TabelleErstellenAlle(ByVal DS As DataSet, ByVal conn As MySql.Data.MySqlClient.MySqlConnection) As String
    102. Dim cmd As New MySql.Data.MySqlClient.MySqlCommand()
    103. If conn.State <> 1 Then conn.Open()
    104. Try
    105. cmd.Connection = conn
    106. For Each dt As DataTable In DS.Tables
    107. cmd.CommandText = modZentraleAufgaben.SQL_TabelleErstellen(DS, dt)
    108. cmd.ExecuteNonQuery()
    109. Next
    110. Catch ex As Exception
    111. Error 9990
    112. End Try
    113. Dim strbld As New System.Text.StringBuilder(1500)
    114. Dim i As Integer
    115. Try
    116. For i = 0 To DS.Relations.Count - 1
    117. If IsNothing(DS.Relations.Item(i).ChildKeyConstraint) = False Then
    118. strbld.Clear()
    119. strbld.Append("ALTER TABLE ")
    120. strbld.Append(DS.Relations.Item(i).ChildKeyConstraint.Columns(0).Table.TableName)
    121. strbld.Append(" ADD CONSTRAINT ")
    122. strbld.Append(DS.Relations.Item(i).RelationName)
    123. strbld.Append(" FOREIGN KEY (")
    124. strbld.Append(DS.Relations.Item(i).ChildKeyConstraint.Columns(0).ColumnName)
    125. strbld.Append(") REFERENCES ")
    126. strbld.Append(DS.Relations.Item(i).ParentKeyConstraint.Columns(0).Table.TableName)
    127. strbld.Append(" (")
    128. strbld.Append(DS.Relations.Item(i).ParentKeyConstraint.Columns(0).ColumnName)
    129. strbld.Append(")")
    130. strbld.Append(Choose(CInt(DS.Relations.Item(i).ChildKeyConstraint.DeleteRule) + 1, " ON DELETE NO ACTION", " ON DELETE CASCADE", " ON DELETE SET NULL", " ON DELETE SET DEFAULT"))
    131. strbld.Append(Choose(CInt(DS.Relations.Item(i).ChildKeyConstraint.UpdateRule) + 1, " ON UPDATE NO ACTION", " ON UPDATE CASCADE", " ON UPDATE SET NULL", " ON UPDATE SET DEFAULT"))
    132. strbld.Append(";")
    133. cmd.CommandText = strbld.ToString
    134. cmd.ExecuteNonQuery()
    135. End If
    136. Next
    137. Catch ex As Exception
    138. Error 9991
    139. End Try
    140. conn.Close()
    141. End Function
    142. Private Function SQL_TabelleErstellen(ByVal DS As DataSet, ByVal TBL As DataTable) As String
    143. Dim strbld As New System.Text.StringBuilder(1500)
    144. Dim strbld2 As New System.Text.StringBuilder(1500)
    145. strbld.Append("CREATE TABLE IF NOT EXISTS ")
    146. strbld.Append(TBL.TableName)
    147. strbld.Append(" (")
    148. For Each c As DataColumn In TBL.Columns
    149. If strbld2.Length > 0 Then strbld2.Append(", ")
    150. strbld2.Append(Get_mySQL_CreateString(c))
    151. Next
    152. strbld.Append(strbld2.ToString)
    153. strbld2.Clear()
    154. For Each c As DataColumn In TBL.PrimaryKey
    155. If strbld2.Length > 0 Then strbld2.Append(", ")
    156. strbld2.Append(c.ColumnName)
    157. Next
    158. If strbld2.Length > 0 Then
    159. strbld.Append(", PRIMARY KEY (")
    160. strbld.Append(strbld2.ToString)
    161. strbld.Append(")")
    162. End If
    163. strbld.Append(");")
    164. Return strbld.ToString
    165. End Function
    166. End Module


    Es werden nicht alle Datentypen unterstützt und die Rückgabewerte der Funktionen teilweise nicht ausgewertet: Weiß ich! :)
    --------
    Lieber inkompetent als inkontinent
    wie in post#75 gesagt: Snippet#3, Zeile #7: weg damit!


    Die Zeilen sind ja sozusagen "weg", wenn bolNurTabellenAnlegen = True ist. Da ich sie aber im "regulären" Betrieb brauche, habe ich es über die boolsche Variable quasi umschaltbar gemacht:

    VB.NET-Quellcode

    1. Shared Sub New()
    2. Dts = New dsMain
    3. If modZentraleAufgaben.bolNurTabellenAnlegen = False Then
    4. Dts.Persist(False, Dts.Tables.Cast(Of DataTable).Where(Function(tb) tb.PrimaryKey.Length = 0).ToArray) 'Tabellen ohne PrimKey-Column aus Persistierung rausnehmen
    5. Dts._sCon = modZentraleAufgaben.GetConnectionString
    6. Dts._Persistance = New MySqlServerPersistance(Dts._sCon, Dts)
    7. Dts._Persistance.Connection_EnterOpen()
    8. 'Try
    9. ' Dts._Persistance.Connection_EnterOpen()
    10. ' MsgBox("MySQL Verbindung OK")
    11. 'Catch ex As Exception
    12. ' MsgBox(ex.Message)
    13. 'End Try
    14. End If
    15. End Sub



    Den Datentyp ändere ich. Danke!
    --------
    Lieber inkompetent als inkontinent