DataGridView mit mehreren Tabellen

nr8

Grünschnabel
Hallo.

Ich hab ein Problem mit dem Update eines DataGridViews.
Ich verwende das ganze mit MySQL unter VB2008

Mein Problem besteht beim Update. Das auslesen der Daten geht ohne Probleme aber beim Update bekomme ich diesen Fehler:
Dynamische SQL-Generierung wird gegen mehrere Basistabellen nicht unterstützt.

Hier ist mein Code dazu:
Code:
Imports MySql
Imports MySql.Data
Imports MySql.Data.MySqlClient

Public Class Verwalten
    'MySQL deklarieren
    Dim conn As New MySqlConnection("server=IP;user id=USER;password=PW;database=DB")
    Dim myCommand As New MySqlCommand
    Dim myAdapter As New MySqlDataAdapter
    Dim myReader As MySqlDataReader
    Dim myData As New DataTable
    Dim myDataGrid As DataGridView 'neu
    Dim myDataView As DataView 'neu
    Dim myDataSet As DataSet 'neu
    Dim vSQL As New String(Nothing)

Private Sub Verwalten_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
         Try
           myAdapter = New MySqlDataAdapter("", conn)
           myAdapter.SelectCommand.CommandText = "SELECT DISTINCT Personen.Id, Personen.Titel, Personen.Vorname, Personen.Nachname, Personen.Geb, Personen.Strasse, Personen.PLZ, Personen.Ort, Personen.Email, Personen.Tel, Listennamen.Name FROM Personen INNER JOIN Maillisten ON Personen.Id = Maillisten.P_Id INNER JOIN Listennamen ON Listennamen.Id = Maillisten.L_Id ORDER BY Personen.Id ASC"
            myAdapter.SelectCommand.CommandType = CommandType.Text
            myDataSet = New DataSet("Personen")
            myData = New DataTable("Personen")
            myDataSet.Tables.Add(myData)

            myAdapter.MissingSchemaAction = MissingSchemaAction.AddWithKey
            myAdapter.Fill(myData)

            myDataView = New DataView(myData)
            myDataGrid = New DataGridView

            With DG_Verwalten
                .DataSource = myDataView
                .AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells
                .AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.DisplayedCells
                .RowsDefaultCellStyle.BackColor = Color.Gray
                .AlternatingRowsDefaultCellStyle.BackColor = Color.WhiteSmoke
            End With
        Catch ex As Exception
            MsgBox("Verbindung zum Server konnte nicht aufgebaut werden.", MsgBoxStyle.Critical, Title:="Information")
        End Try
    End Sub

Private Sub B_Speichern_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles B_Speichern.Click
        Dim cmdb As MySqlCommandBuilder
        cmdb = New MySqlCommandBuilder(myAdapter)
        myAdapter.Update(myData)
    End Sub
End Class


Wie kann ich diesen Fehler umgehen?
Vielen Dank.
 
Scheinbar möchtest du vorhandene Personen einer Mailingliste hinzufügen oder aus ihr löschen. Dazu solltest du die drei Tabellen Personen, Maillisten und Listennamen in drei getrennten Tabellen eines Datasets verwalten, für die dann automatische UPDATE-Statements generiert werden können; das ist dann auch bei der Anzeige und Eingabe sehr hilfreich.
Alternativ dazu kannst du aber auch das erforderliche UPDATE-Statement selber definieren und dem DataAdapter zuweisen. Achte aber darauf, dass du auch die erforderlichen ID's der Datensätze verfügbar haben musst; füge die entsprechenden Spalten also deinem SELECT-Staement hinzu. Für das DataGridView kannst du dann diese Spalten als unsichtbar definieren oder sie ganz unterdrücken.
 
Dank für die Antwort. Leider hatte ich bis jetzt keine Zeit.
Welche Lösung würdest du vorschlagen? bzw. ist die bessere?

Könntest du mir vielleicht auch ein kleines Beispiel für die Umsetzung angeben? Bein leider in .Net nicht wirklich gut unterwegs :)
Danke.
 
Als erstes gehe mal in das Microsoft SQL Server Management Studio. Mache dort einen Rechtsklick auf deine Datenbank und wähle im Kontextmenü
Skript für Datenbank als > CREATE in > Datei...
Das gleiche machst du bei den Tabellen. Rechtsklick auf die Tabelle und im Kontextmenü
Skript für Tabelle als > INSERT in > Datei...

Und die Ergebnisse postest du hier. Außerdem wäre noch ein Screenshot deines Formulars ganz nützlich.

Außerdem empfehle ich dir die Lektüre des Onlinebooks Visual C#, hier der Download-Link
 
Gern geschehen.
Ob MySQL oder eine andere Datenbank ist egal, die Vrogehensweise ist die gleiche. Allerdings würden Testdaten die Erstellung eines Demos erleichtern.
 
Wenn ich das UPDATE-Statement selbst definieren würde brauch ich im grunde nur abfragen beim speichern ob sie dich Daten im Grid verändert haben oder? Wenn ja UPDATE. Zum UPDATE-Statement selbst... Wie genau müsste das ablaufen? Muss ich da jeden Wert selbst überprüfen ob er geändert wurde?

Wenn man möchte das das UPDATE-Statement automatisch generiert werden soll wie müsste man dann vorgehen?
Wie sagen ich dem Grid das er die Daten aus verschiedenen Tabellen in Verbindung der Primärschlüssel richtig anzeigt?

Danke.
 
Es ist sogar noch einfacher. Du must dann nur die Update-Methode des DataAdapters aufrufen, und dieser führt dann automatisch für jede DataRow das zugehörige INSERT-, UPDATE- oder DELETE-Statement aus. Vorher musst du allerdings die Eigenschaften InsertCommand, UpdateCommand und DeleteCommand korrekt setzen, und zwar so, dass die jeweiligen Werte auch als Parameter übergeben werden können. Ich habe dir bei MSDN ein Beispiel für SQLServer-Klassen herausgesucht. Für MySQL gibt es eigene Klassen, aber die Vorgehensweise ist die gleiche.
 
Zurück