MySQL Datagridview Update mit INNER JOIN

  • VB.NET
  • .NET (FX) 4.0

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    MySQL Datagridview Update mit INNER JOIN

    Hallo Ihrs :)

    Momentan habe ich ein Problem mit dem Updaten des Datagridviews.
    Mit Text, sowie Varchar(100) getestet:
    Jedes mal wenn eine der Textspalten eine Leerstelle enthält,
    FALSCH: Was muss man bei DateTime und Date - Spalten einrichten, dass es richtig geupdated wird?
    will die DGV-Routine nicht mehr den Update der DB fahren.

    Dieser Fehler tritt sonst nicht auf.
    Da einige dieser Text-Zeilen Informationen sind, dürfen (müssen) diese auch Leerstellen enthalten.

    Wie kann man diesen Fehler umgehen?


    Bild des DataGridViews:


    Bild der Fehlermeldung:



    Ebenfalls:
    Wie mache ich ein DGV mit mehreren Tabellen
    inklusive INNER JOIN
    und automatisiertem Updaten

    der betroffenen Tabellen im DGV?
    Wie man den SQL-Befehl selbst mit INNER JOIN selbst schreibt, ist mir bekannt.


    VB.NET-Quellcode

    1. 'Aufruf des DGV
    2. Private Sub tsb_Komponenten_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TSB_Komponenten.Click
    3. 'RemoveHandler PNL_KompListe_DGVKomp.RowEnter, AddressOf PNL_KompListe_DGVKomp_RowEnter
    4. Dim SplitStr As Char = CChar("\")
    5. Dim value() = TreeView.SelectedNode.FullPath.Split(SplitStr)
    6. Dim MultiList As List(Of List(Of String)) = FillWithTreeViewEntries(UBound(value))
    7. SQLKomp.ExecQuery("SELECT * FROM Komponenten", MultiList, "BMW")
    8. SQLKomp.loadgrid(PNL_KompListe_DGVKomp, "BMW")
    9. 'AddHandler PNL_KompListe_DGVKomp.RowEnter, AddressOf PNL_KompListe_DGVKomp_RowEnter
    10. PNL_KompListe.BringToFront()
    11. End Sub


    VB.NET-Quellcode

    1. 'Aufruf der Update-Routine
    2. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    3. SQLKomp.SQLDA.Update(SQLKomp.SQLDS)
    4. SQLKomp.loadgrid(PNL_KompListe_DGVKomp, "DB2")
    5. End Sub


    VB.NET-Quellcode

    1. 'Quellcode der SQLKomp-Class
    2. Imports System.Data
    3. Imports MySql.Data.MySqlClient
    4. Public Class C_SQLControl
    5. 'CONNECTION
    6. Private SQLCmd As MySqlCommand
    7. 'SQL DATA
    8. Public SQLDA As New MySqlDataAdapter
    9. Public SQLDS As DataSet
    10. 'QUERY PARAMETERS
    11. Public params As New List(Of MySqlParameter)
    12. 'QUERY STATISTICS
    13. Public RecordCount As Integer
    14. Public Exception As String
    15. Public Sub ExecQuery(ByVal Query As String, ByVal Multilist As List(Of List(Of String)), ByVal DBSTR As String)
    16. Dim SQLCon As New MySqlConnection("server=192.168.20.181;Port=3306; User ID = User123456 password=PW123456 ; database=" & DBSTR & ";Convert Zero Datetime=True")
    17. Try
    18. SQLCon.Open()
    19. 'Create SQL COMMAND
    20. SQLCmd = New MySqlCommand(Query, SQLCon)
    21. Try
    22. For Each n In Multilist
    23. SQLCmd.Parameters.AddWithValue("@" & n(0), n(1))
    24. Next
    25. Catch ex As Exception
    26. 'NO PARAMETERS GIVEN :(
    27. End Try
    28. 'LOAD PARAMETERS INTO SQL COMMAND
    29. params.ForEach(Sub(x) SQLCmd.Parameters.Add(x))
    30. 'CLEAR PARAMETERS LIST
    31. params.Clear()
    32. 'EXECUTE COMMAND AND FILL DATASET
    33. SQLDS = New DataSet
    34. SQLDA = New MySqlDataAdapter(SQLCmd)
    35. RecordCount = SQLDA.Fill(SQLDS)
    36. SQLCon.Close()
    37. Catch ex As Exception
    38. Exception = ex.Message
    39. MsgBox(Exception)
    40. End Try
    41. If SQLCon.State = ConnectionState.Open Then SQLCon.Close()
    42. End Sub
    43. Public Sub loadgrid(ByVal dgv As DataGridView, ByVal DBStr As String)
    44. Dim SQLCon As New MySqlConnection("server=192.168.20.181;Port=3306; User ID=User123456 password=PW123456; database=" & DBSTR & ";Convert Zero Datetime=True")
    45. 'IF DATA IS RETURNED THEN POPULATE GRID AND BUILD UPDATE COMMAND
    46. ' If RecordCount > 0 Then
    47. dgv.DataSource = SQLDS.Tables(0)
    48. dgv.Rows(0).Selected = True
    49. 'DYNAMICALLY GENERATES UPDATE SCRIPT FOR ALL MODIFIED ENTRIES IN DGV
    50. SQLDA.UpdateCommand = New MySqlCommandBuilder(SQLDA).GetUpdateCommand
    51. ' End If
    52. End Sub
    53. End Class

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

    ich würd empfehlen, den kompletten Ansatz in Tonne zu treten.
    Arbeite dich erstmal in Databinding und typisierte Datasets ein.
    Dann kannst du dir pro DataTable einen funktionsfähigen DataAdapter konfigurieren, den du mehrmals verwendest.
    Dieses Gewurstel mit der MultiList failt schonmal logischerweise, wenn da Werte auftreten, die Spaces enthalten - ich weiß aber nicht, ob das der einzige Fehler ist, und ob dieser wirklich die Ursache des Absturzes ist.
    Und mehrere DataTables kannst du so garnimmer handeln, spätestens dann brauchst du die genannten vorkonfigurierten DataAdapter.

    inklusive InnerJoin
    gibts dabei nicht, stattdessen kannst du sog. "JoiningViews" bilden.
    Die sehen genauso aus wie gejointe Tabellen, sind aber ungleich mächtiger, weil sie eben keine gejointen Tabellen sind.
    Und deshalb können sie auch abspeichern, was eine gejointe Tabelle nicht kann.
    Weil eine gejointe Tabelle ist ja quasi "virtuell" - die wird ja nur vom Sql-Provider generiert, ohne dass ihr eine wirkliche DbTabelle zugrunde liegt - logisch und unvermeidlich, dass so ein Dingens nicht rückspeicherbar ist - weil da ist ja nix zum rückspeichern.

    gugge vier Views-Videos für die Geschichte mit Databinding und JoiningViews, gugge alle Punkte von Datenverarbeitungs-Vorraussetzungen durch für das gesamte erforderliche KnowHow.
    Weil zB. ohne ein Datenmodell richtig konzipieren zu können nützt dir alles annere auch nicht die Bohne.
    Ich hätte 2 Fragen:
    kann man das DataSet so flexibel gestalten, dass man im Dataset Designer Tabellen erzeugt die sich auf die MySQL Datenbank auswirken oder anders rum?
    Der Grund, warum mit Code anstatt dem Designer gearbeitet wurde, war, dass man dadurch alles variabel anhand der Datenbank anzeigen lassen kann.
    Das Dataset ist dagegen komplett starr.


    Kann man den ConnectionString so verändern, dass es auf bestimmte Datenbanken (mit gleicher Struktur) zugreift?

    Momentan habe ich das Problem, dass das Dataset selbst komplett starr ist und man groß nichts verändern kann.
    Leider habe ich noch keine kompletten Vorgaben in Form von Spalten von Tabellen für die Datenbank. Das kann sich noch ändern.
    Das ist Absicht, dass ein Dataset starr ist. Das Dataset ist Abbild des Datenmodells, und ein Datenmodell ist ebenfalls starr (wie auch die DB starr ist).

    Etwa eine Lagerhaltung ist ein Vorgang in der Wirklichkeit, der entsprechend im Modell abgebildet wird. Solange die Organisation der Lagerhaltung in der Wirklichkeit nicht umstrukturiert wird, solange soll auch das Datenmodell unverändert bleiben.

    Aufbauend auf dem Datenmodell wird ja das Programm entwickelt, und ProgrammCode ist ebenfalls starr.
    Wenn einem Programm das Datenmodell unterm Hintern geändert würde, wäre es sofort unbrauchbar.
    Weil das Programm muss das Datenmodell "kennen", sonst kann kein sinnvoller Code dafür geschrieben werden.

    Das dolle an relationaler Modellierung ist halt, dass gänzlich starre Modelle dennoch unerhört flexible Datenflüsse beschreiben können.
    Dazu muss man aber Struktur und Daten gedanklich trennen.
    Wenn du anfängst, zur Laufzeit am Datenmodell rumzufummeln, machst du was falsch, und bringst die Ebenen durcheinander.



    Jo, natürlich kann man mit geändertem Connectionstring die Anwendung auf eine andere DB switchen. Ist aber meist überhaupt keine gute Idee, weil mehrere DBs zum selben Anwendungszweck eröffnen unendlich viele Möglichkeiten für Verwirrungen und Verwechlungen.

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

    im Dataset die Datenbank wechseln?
    Ein Dataset hat mit einer Datenbank doch ühaupt nix zu tun. Dem Dataset ists völlig schnuppe, woher die Daten kommen, mit denen es befüllt wird.

    Aber stell das Problem hintan, weil da hängt ein Rattenschwanz an Problemen dran, bis Hameln, die bei solchen Spielchen auftreten.
    Mach dein Proggi erstmal ganz ohne Datenbank, allein basierend auf typisierten Dataset, lauffähig.

    Dann kannst du immer noch eine DB hinterlegen, und danach kannste dich auch gerne noch dran versuchen, es zu managen, wenn mehrere DBs da iwie herumfliegen - viel Spass.

    Gunngir schrieb:

    Je nach ausgewähltem Projekt muss das Komponenten - Datagridview mit den richtigen Daten befüllt werden.
    Alle Projekte haben die gleiche Struktur.
    Ja und?
    Dann kommen alle Projekte logischerweise in eine Tabelle - mit Sicherheit kein Grund, da jetzt mit mehreren Datenbanken drauf loszugehen.
    Hingegen ists ein Grund, relationale Datenmodellierung zu erlernen, denn damit ist das zu lösen.
    Links dazu haste ja bereits in Post#2