tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
7
ZUGRIFFE
1674
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    nr8 nr8 ist offline Mitglied
    Registriert seit
    Oct 2005
    Beiträge
    15
    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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    
    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.
     

  2. #2
    Avatar von Vereth
    Vereth Vereth ist offline Mitglied Brokat
    Registriert seit
    Nov 2009
    Ort
    Dortmund
    Beiträge
    372
    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.
     
    Vielen Dank für die Nutzung des Bewerten- und Danke-Buttons

    Wenn man sieht, dass man einen anderen glücklich gemacht hat, ist die Welt um zwei glückliche Menschen reicher.

  3. #3
    nr8 nr8 ist offline Mitglied
    Registriert seit
    Oct 2005
    Beiträge
    15
    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.
     

  4. #4
    Avatar von Vereth
    Vereth Vereth ist offline Mitglied Brokat
    Registriert seit
    Nov 2009
    Ort
    Dortmund
    Beiträge
    372
    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
     
    Vielen Dank für die Nutzung des Bewerten- und Danke-Buttons

    Wenn man sieht, dass man einen anderen glücklich gemacht hat, ist die Welt um zwei glückliche Menschen reicher.

  5. #5
    nr8 nr8 ist offline Mitglied
    Registriert seit
    Oct 2005
    Beiträge
    15
    Danke für den Link.
    Bezüglich dem SQL. Ich verwende MySQL mit dem MySQL-Connector.
     

  6. #6
    Avatar von Vereth
    Vereth Vereth ist offline Mitglied Brokat
    Registriert seit
    Nov 2009
    Ort
    Dortmund
    Beiträge
    372
    Gern geschehen.
    Ob MySQL oder eine andere Datenbank ist egal, die Vrogehensweise ist die gleiche. Allerdings würden Testdaten die Erstellung eines Demos erleichtern.
     
    Vielen Dank für die Nutzung des Bewerten- und Danke-Buttons

    Wenn man sieht, dass man einen anderen glücklich gemacht hat, ist die Welt um zwei glückliche Menschen reicher.

  7. #7
    nr8 nr8 ist offline Mitglied
    Registriert seit
    Oct 2005
    Beiträge
    15
    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.
     

  8. #8
    Avatar von Vereth
    Vereth Vereth ist offline Mitglied Brokat
    Registriert seit
    Nov 2009
    Ort
    Dortmund
    Beiträge
    372
    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.
     
    Vielen Dank für die Nutzung des Bewerten- und Danke-Buttons

    Wenn man sieht, dass man einen anderen glücklich gemacht hat, ist die Welt um zwei glückliche Menschen reicher.

Ähnliche Themen

  1. Verschiedene Tabellen per Auswahl in ein DataGridView laden
    Von technikfrager im Forum .NET Datenverwaltung
    Antworten: 0
    Letzter Beitrag: 19.12.09, 21:55
  2. Mehrere Tabellen eines DataSet in einem DataGridView
    Von schebi im Forum .NET Datenverwaltung
    Antworten: 0
    Letzter Beitrag: 10.02.08, 10:22
  3. Löschen aus mehreren Tabellen
    Von bastiglasl im Forum Relationale Datenbanksysteme
    Antworten: 5
    Letzter Beitrag: 13.09.05, 18:01
  4. SQL Abfrage aus mehreren Tabellen
    Von Iron_Maik im Forum Relationale Datenbanksysteme
    Antworten: 4
    Letzter Beitrag: 10.02.05, 14:09
  5. Join mit mehreren Tabellen
    Von akkie im Forum Relationale Datenbanksysteme
    Antworten: 3
    Letzter Beitrag: 17.08.03, 12:14