MySql in Dataset

  • VB.NET

Es gibt 34 Antworten in diesem Thema. Der letzte Beitrag () ist von schnibli.

    Da ich gerne mit dem Designer arbeite, habe ich versucht den Update Command selber zu schreiben und hab zu Test zwecken mal 3 Spalten in Angriff genommen:

    SQL-Abfrage

    1. UPDATE tblAnlagenNr
    2. SET ID = ?, AnlagenNr = ?, ProjektBezeichnung = ?
    3. WHERE (? = 1) AND (ProjektBezeichnung IS NULL) AND (? = 1) AND (AnlagenNr IS NULL) AND (ID = ?) OR
    4. (? = 1) AND (ProjektBezeichnung IS NULL) AND (AnlagenNr = ?) AND (ID = ?) OR
    5. (? = 1) AND (ProjektBezeichnung = ?) AND (AnlagenNr IS NULL) AND (ID = ?) OR
    6. (ProjektBezeichnung = ?) AND (AnlagenNr = ?) AND (ID = ?)


    Wenn ich nun einen Datensatz im DGV ändere und anschlissen Speichern möchte kommt:
    Ein Ausnahmefehler des Typs "System.Data.DBConcurrencyException" ist in System.Data.dll aufgetreten.

    Zusätzliche Informationen: Parallelitätsverletzung: Der UpdateCommand hat sich auf 0 der erwarteten 1 Datensätze ausgewirkt.
    Woran kann das liegen?
    ich verstehe die Frage nicht. Weil die Antwort steht doch da: Der UpdateCommand hat sich auf 0 der erwarteten 1 Datensätze ausgewirkt.

    Wenn du ein Update sendest, und es updatet nichts, dann kriegst du diesen Fehler.

    Du solltest wirklich den Commandbuilder das machen lassen - der weiß auch die Parameter zu konfigurieren.
    Wenn ich keinen Datensatz ändere und Update erscheint dieser Fehler nicht,
    Ändere ich einen Datensatz und sende anschlisend den Update Befehl, kommt dieser Fehler.

    VB.NET-Quellcode

    1. Me.TblAnlagenNrDataGridView.EndEdit()
    2. Me.TblAnlagenNrBindingSource.EndEdit() ' schreibt Cell in DataRow
    3. Me.TblAnlagenNrTableAdapter.Update(Me.Mysql_anlagen_DataSet1.tblAnlagenNr) ' schreibt DataRow in Datenbank
    wenn du keinen Datensatz änderst, dann sendet der TableAdapter bei .Update() kein UpdateCommand.

    Wenn du einen Datensatz änderst, dann sendet der TableAdapter bei .Update() das UpdateCommand.

    Das UpdateCommand tut aber offensichtlich nicht, wasses soll, denn es ändert in der DB keinen Datensatz.
    Im richtigen Leben, mit korrekt funktionierenden Multi-User-Datenbanken hat man eine Parallelitäts-Verletzung, wenn 2 User denselben Datensatz abrufen, und beide ihn rückspeichern.
    Denn dann überschreibt das Update des 2. Users das Update des ersteren, und das ist nicht fair.

    Die generierten TableAdapter generieren daher UpdateCommands, die abprüfen, ob der zu updatende Datensatz noch mit allen Werten genau so vorliegt, wie er abgerufen wurde. Und nur dann updaten sie.
    Findet sich der Datensatz nicht unangetastet wieder, so updaten sie nicht, und dann geht der Tableadapter davon aus, dass der Datensatz zwischenzeitlich von jmd anners geändert abgespeichert wurde, also dass eine Parallelitätsverletzung vorliegt.
    nein - denk doch mal logisch: Warum kann der Datensatz nicht geupdatet werden? Weil in der Where-Klausel irgendwas steht, was bewirkt, dasser nicht gefunden wird. Dann - hatten wir das nicht schon? - wirkt sich das UpdateCommand logischerweise auf 0 Datensätze aus.
    Ausserdem kanns an den Parametern liegen, dass die falsch konfiguriert sind, und an den Werten, die den Parametern übergeben werden.

    Kurzn gut: Lass sowas doch besser den CommandBuilder machen.
    Ich habe diese Connection Aufgebauten:

    VB.NET-Quellcode

    1. Dim conString As String
    2. conString = "Server=192.168.61.5;database=anlagendatenbank;User ID=test;Pwd=test;"
    3. Dim myConnection As MySqlConnection = New MySqlConnection()
    4. Dim cmd As New MySqlCommand
    5. Dim myAdapter As New MySqlDataAdapter
    6. Dim dataset1 As New DataSet
    7. myConnection.ConnectionString = "Server=192.168.61.5;Database=anlagendatenbank;Uid=datenbank;Pwd=datenbank;"
    8. myConnection.Open()
    9. Label1.Text = "in"
    10. cmd.CommandText = "SELECT * FROM tblServiceMonteure"
    11. cmd.Connection = myConnection
    12. myAdapter.SelectCommand = cmd
    13. myAdapter.Fill(dataset1)
    14. label2.text = (myAdapter.ToString)
    15. myConnection.Close()
    16. Label1.Text = "out"


    Wie bring ich nun die Daten statt in dataset1 in mein mit dem Designer erstellte dataset/table:


    _____________________________________

    Edit:

    Die Daten Konnte ich nun Laden:

    VB.NET-Quellcode

    1. Dim MysqlConn As MySqlConnection
    2. Dim anlagendatenbankCommand As New MySqlCommand
    3. Dim anlagendatenbankAdapter As New MySqlDataAdapter
    4. Dim SQL As String
    5. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    6. MysqlConn = New MySqlConnection()
    7. SQL = "SELECT * FROM tblServiceMonteure"
    8. 'Connection String
    9. MysqlConn.ConnectionString = "server=192.168.61.5;" _
    10. & "user id=datenbank;" _
    11. & "password=datenbank;" _
    12. & "database=anlagendatenbank"
    13. ' Try, Catch, Finally
    14. Try
    15. MysqlConn.Open()
    16. anlagendatenbankCommand.Connection = MysqlConn
    17. anlagendatenbankCommand.CommandText = SQL
    18. anlagendatenbankAdapter.SelectCommand = anlagendatenbankCommand
    19. anlagendatenbankAdapter.Fill(Me.Anlagendatenbank.tblServiceMonteure)
    20. Catch myerror As MySqlException
    21. MessageBox.Show("Cannot connect to database: " & myerror.Message)
    22. Finally
    23. MysqlConn.Close()
    24. MysqlConn.Dispose()
    25. End Try
    26. End Sub


    In der MySql war kein Primary Key hinterlegt, jetzt geht es :)

    VB.NET-Quellcode

    1. Dim oCB As MySqlCommandBuilder
    2. oCB = New MySqlCommandBuilder(anlagendatenbankAdapter)
    3. oCB.GetInsertCommand()


    Aber wie ist es möglich, über 2 Abfragen ein CommandBuilder einzufügen.?
    Bilder
    • dataset.PNG

      4,14 kB, 207×161, 279 mal angesehen

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „schnibli“ ()