Anfänger Problem mit updatecommand

  • VB6

Es gibt 31 Antworten in diesem Thema. Der letzte Beitrag () ist von Mad Andy.

    Anfänger Problem mit updatecommand

    Hallo zusammen,

    ich bin Neuling in der Programmierung mit VB2005 und vorallem aber auch in der
    Datenbankprogrammierung.

    Ich weis, beides nicht die besten Voraussetzungen, aber es hilft ja
    nichts...

    Ich hoffe ihr könnt trotzdem helfen.

    Folgendes Problem:

    Ich habe eine Accessdatenbank, worauf ich zugreifen möchte. ANzeigen,
    neuen Datensatz hinzufügen und löschen klappt auch ganz gut (hab den
    Designer Assisten genutzt).

    Nur ein aktualisieren klappt einfach nicht. Er bricht immer mit
    folgender Meldung ab:Aktualisieren erfordert einen gültigen
    UpdateCommand, wenn eine DataRow-Auflistung mit modifizierten Zeilen
    weitergegeben wird.

    Jetzt hab ich schon zig Threads in dieser Gruppe und im Web gelesen,
    aber ich versteh es einfach nicht.

    Den vollständigen Code könntet Ihr hier ansehen:
    groups.google.de/group/microso…=1&hl=de#82d4e76382793fbc

    Vielen Dank Schonmal im vorraus...

    Grüße
    Dominic
    ok,

    ich glaub ich bin zu doof zu.

    wenn ich meine update zeile
    von oben raus nehme und dafür
    update Recordings set RecID="test" where ID=1
    eingebe, erhalte ich nur fehler.
    er sagt mr, Recordings (meine tabelle aus der Datenbank) sei nicht deklariert und set akzeptiert er auch nicht, weil er ein "()" erwartet.


    Muss ich VB vorher irgendwie mitteilen, dass ich einen sql befehl eingeben möchte?

    Gruß
    Dominic
    Hi!

    Das von Agent war nur ein SQL-Befehl... Der hat nichts mit der VB-Syntax zu tun sondern ist ein String, der dem Datenbank-Server eine oder mehrere Anweisungen gibt...

    Geraten müsste das so aussehen:

    Visual Basic-Quellcode

    1. Me.RecordingsTableAdapter.Execute("update tabelle1 set feld1='wert' where ID=1")
    die SQL-Befehle könnten aber auch total anders ausgeführt werden...

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

    Hi,

    das geht ja rasant schnell, vielen Dank!

    Ich habs gerade ausprobiert.

    Ich bekomme die Fehlermeldung
    Fehler 1 "Execute" ist kein Member von "WindowsApplication1.pvrDataSetTableAdapters.RecordingsTableAdapter". C:\Dokumente und Einstellungen\Dominic\Eigene Dateien\Visual Studio 2005\Projects\BV auslesen\BV auslesen\Form1.vb 7 9 BV auslesen
    dachte ich mir...
    Ich werds mir mal genauer anschauen.

    In 10-20 minuten kannst du wieder rein schaun :)

    Edit: welche Version von VB 2005 verwendest du? Express?

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

    so... hat doch etwas länger gedauert...

    Müsste so gehen:

    Visual Basic-Quellcode

    1. 'SQL-String erzeugen
    2. Dim sql_string = "UPDATE test SET field1=2 WHERE ID=1"
    3. 'SQL-Befehlsobjekt erzeugen
    4. Dim cmd As New System.Data.OleDb.OleDbCommand(sql_string, TestTableAdapter.Connection)
    5. 'Verbindung herstellen und SQL-Befehl ausführen
    6. cmd.Connection.Open()
    7. MsgBox(cmd.ExecuteNonQuery() & " Einträge waren betroffen.")
    8. cmd.Connection.Close()
    9. 'Daten neu einlesen...
    10. TestTableAdapter.Fill(Me.TestDataSet.test)


    EDIT: du musst natürlich alle werte anpassen. bei mir heißt z.B. sowohl die db alsauch die table test und das zu verändernde Feld heißt field1, ID ist der Primärschlüssel

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

    Hey,
    super, das hilft mir schon mal weiter.

    Ein Problem habe ich aber noch.

    Folgender Code funktioniert einwandfrei:

    Visual Basic-Quellcode

    1. Private Sub RecordingsBindingNavigatorSaveItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RecordingsBindingNavigatorSaveItem.Click
    2. 'SQL-String erzeugen
    3. Dim Test = Label1.Text
    4. MsgBox(Test)
    5. Dim sql_string = "UPDATE Recordings SET Filename=" & "6766767" & " WHERE RECID=1"
    6. 'SQL-Befehlsobjekt erzeugen
    7. Dim cmd As New System.Data.OleDb.OleDbCommand(sql_string, RecordingsTableAdapter.Connection)
    8. 'Verbindung herstellen und SQL-Befehl ausführen
    9. cmd.Connection.Open()
    10. MsgBox(cmd.ExecuteNonQuery() & " Einträge waren betroffen.")
    11. cmd.Connection.Close()
    12. 'Daten neu einlesen...
    13. RecordingsTableAdapter.Fill(Me.PvrDataSet.Recordings)
    14. End Sub


    Wenn ich aber nun "6766767" durch Label1.Text oder Test ersetze, erhalte ich folgenden Fehler:
    {"Für mindestens einen erforderlichen Parameter wurde kein Wert angegeben."}
    (System.Data.OleDb.OleDBException)

    Kann man denn nur ziffern und keinen Text übergeben?

    Grüße
    Communicate
    Dim sql_string = "UPDATE Recordings SET Filename='" & Label1.Text & "' WHERE RECID=1"

    Text muss in SQL immer in Anführungszeichen, Zahlen nicht.
    Gruß, Agent Smith 8-)

    activeFlags = (lazy OR weary)

    Lemgo-Verschwörung | Mathematics | VB-Paradise in blau

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

    Ok, vielen Dank, klappt prima.

    Nur sind hier doch nur jeweils ein Hochkomma (') und keine Anführungszeichen am werk, oder?

    Btw kann man "RecID=1"
    auch irgendwie durch RecID = i ersetzten, wobei i dann immer automatisch der Schlüssel vom gerade bearbeiteten Datensatz sein sollte.

    Und nochmal vielen vielen Dank für die schnelle Hilfe.
    Das hat man heut zu tag nur noh selten ;)

    Grüße
    Dominic
    Dim sql_string = "UPDATE Recordings SET Filename='" & Label1.Text & "' WHERE RECID=" & i
    oder
    Dim sql_string = "UPDATE Recordings SET Filename=""" & Label1.Text & """ WHERE RECID=1" & i

    Ob Anführungszeichen oder Hochkomma ist in SQL egal
    Gruß, Agent Smith 8-)

    activeFlags = (lazy OR weary)

    Lemgo-Verschwörung | Mathematics | VB-Paradise in blau

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

    Hi,

    was hat es denn mit dem "$" Zeichen auf sich?
    For i = 0 To 999
    $sql_string=Dim sql_string = "UPDATE Recordings SET Filename='" & Label1.Text & "' WHERE RECID=" & i
    '...
    Next i

    Leider funktioniert das nicht. Wenn ich $sql_string
    weglasse, ändert er mir alle Datensätze, ich möchte aber ja nur den Datensatz ändern, der gerade bearbeitet wurde.

    Mein Code sieht jetzt so aus:

    Visual Basic-Quellcode

    1. Private Sub RecordingsBindingNavigatorSaveItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RecordingsBindingNavigatorSaveItem.Click
    2. 'SQL-String erzeugen
    3. Dim Test = Label1.Text
    4. Dim i As Integer
    5. 'MsgBox(Test)
    6. ' Dim sql_string = "UPDATE Recordings SET Filename=" & Test & " WHERE RECID=1"
    7. ' Dim sql_string = "UPDATE Recordings SET Filename='" & Label1.Text & "' WHERE RECID=RECID"
    8. 'Dim sql_string = "UPDATE Recordings SET Filename='" & Label1.Text & "' WHERE RECID=" & i
    9. For i = 0 To 9
    10. Dim sql_string = "UPDATE Recordings SET Filename='" & Label1.Text & "' WHERE RECID=" & i
    11. '...
    12. 'MsgBox(sql_string)
    13. 'SQL-Befehlsobjekt erzeugen
    14. Dim cmd As New System.Data.OleDb.OleDbCommand(sql_string, RecordingsTableAdapter.Connection)
    15. 'Verbindung herstellen und SQL-Befehl ausführen
    16. cmd.Connection.Open()
    17. MsgBox(cmd.ExecuteNonQuery() & " Einträge waren betroffen.")
    18. cmd.Connection.Close()
    19. Next i
    20. 'Daten neu einlesen...
    21. RecordingsTableAdapter.Fill(Me.PvrDataSet.Recordings)
    22. End Sub


    Nochmal vielen Dank für Eure Hilfe!

    Grüße
    Dominic
    ups...
    das $ is da wohl aus php mit rein gerutscht ^^
    gehört natürlich nicht dahin ;)
    Also einfach nur sql_string

    shit happens...

    EDIT:
    @ admin / mods:
    Bei meinem letzten Post (2 posts weiter oben) steht bei mir
    Keine Verbindung zur Datenbank möglich. Wiederholen Sie den Vorgang später nocheinmal.
    Der Post hat aber schonmal funktioniert und ich hab den seit dem nicht geändert. Wenn ich auf Edit klicke, kommt auch der richtige BB-Code

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

    also wenn ich

    Visual Basic-Quellcode

    1. sql_string=Dim sql_string = "UPDATE Recordings SET Filename='" & Label1.Text & "' WHERE RECID=" & i

    eingebe, erhalte ich die meldung, dass sql_string nicht definiert sei.

    Was könnte ich noch falsch machen?

    Mein Code im ganzen:
    Private Sub RecordingsBindingNavigatorSaveItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RecordingsBindingNavigatorSaveItem.Click
    'SQL-String erzeugen
    Dim Test = Label1.Text
    Dim i As Integer
    'MsgBox(Test)
    ' Dim sql_string = "UPDATE Recordings SET Filename=" & Test & " WHERE RECID=1"
    ' Dim sql_string = "UPDATE Recordings SET Filename='" & Label1.Text & "' WHERE RECID=RECID"
    'Dim sql_string = "UPDATE Recordings SET Filename='" & Label1.Text & "' WHERE RECID=" & i
    For i = 0 To 9
    sql_string=Dim sql_string = "UPDATE Recordings SET Filename='" & Label1.Text & "' WHERE RECID=" & i
    '...

    'MsgBox(sql_string)
    'SQL-Befehlsobjekt erzeugen
    Dim cmd As New System.Data.OleDb.OleDbCommand(sql_string, RecordingsTableAdapter.Connection)
    'Verbindung herstellen und SQL-Befehl ausführen
    cmd.Connection.Open()
    MsgBox(cmd.ExecuteNonQuery() & " Einträge waren betroffen.")
    cmd.Connection.Close()
    Next i
    'Daten neu einlesen...
    RecordingsTableAdapter.Fill(Me.PvrDataSet.Recordings)

    End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    'TODO: Diese Codezeile lädt Daten in die Tabelle "PvrDataSet.Recordings". Sie können sie bei Bedarf verschieben oder entfernen.
    Me.RecordingsTableAdapter.Fill(Me.PvrDataSet.Recordings)

    End Sub
    Grüße
    Dominic
    Normalerweise macht man das zwar ein wenig anders (new cmd) aber ich hab grad nicht im kopf, wie die eigenschaften heißen...
    Ich wäre dir in den nächsten tagen die professionellere variante posten :)


    Private Sub RecordingsBindingNavigatorSaveItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RecordingsBindingNavigatorSaveItem.Click

    Dim Test as String = Label1.Text
    Dim i As Long

    'SQL-String erzeugen
    Dim sql_string as string

    'SQL-Befehlsobjekt erzeugen
    Dim cmd As System.Data.OleDb.OleDbCommand

    For i = 0 To 9
    sql_string= "UPDATE Recordings SET Filename='" & Label1.Text & "' WHERE RECID=" & i
    cmd = New System.Data.OleDb.OleDbCommand(sql_string, RecordingsTableAdapter.Connection)
    cmd.Connection.Open()
    cmd.ExecuteNonQuery()
    cmd.Connection.Close()
    Next i

    'Daten neu einlesen...
    RecordingsTableAdapter.Fill(Me.PvrDataSet.Recordings)

    End Sub