Announcement

Collapse
No announcement yet.

dBase UPDATE mit vb über OleDB funktioniert nicht

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • dBase UPDATE mit vb über OleDB funktioniert nicht

    Hallo,
    ich bin leider ein ziemlicher rooky, was vb und ado angeht. Fällt auch bestimmt gleich auf

    Ich habe folgenden Anwendungsfall:

    Ich möhte mit Visual Basic Express Edition 2008 eine Anwendung schreiben, mit der ich vorhandene dBase-Dateinen (*.dbf) einlesen kann, bestimmte Daten ändern und die geänderten Daten in der eingelesenen Datei wieder speichern kann.

    Mein aktueller Stand:
    Einlesen, anzeigen, usw. klappt wunderbar.
    Für diese Operationen nutze ich OleDb(ConnectionString: "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Database")

    Nur mit Speichern, also UPDATE hab ich ziemlich probleme.
    Meine Funktion zum Speichern sieht momentan so aus:
    Die Tabelle table, wurde vorher in das Dataset ds geschrieben und kann ohne Probleme angezeigt werden.
    Die Spalten PASSWORD und OBJECTID sind Integer, SUBBLKTYP ist ein String.

    Code:
    Public Path as String = "C:\Database"
    Public ds As New System.Data.DataSet
    Public OleDBConString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="
    
    'Hier werden verschiedene Operationen ausgeführt, um die Tables zu lesen usw.
    
    Private Sub Save()
    Dim Cmd As String = "UPDATE Table1 SET PASSWORD=3 WHERE OBJECTID=1 AND SUBBLKTYP='00014'"
    Dim con As New System.Data.OleDb.OleDbConnection(OleDBConString & path  & ";Extended Properties=dBASE IV;User ID=Admin;Password=;")
    Dim da As New System.Data.OleDb.OleDbDataAdapter(Cmd, con)
                          
    Dim builder As OleDbCommandBuilder = New OleDbCommandBuilder(da)
    
    con.Open()
    builder.GetUpdateCommand()
    
    da.Update(ds, "Table1")
    
    End Sub
    Bei der ausführung des Code bekomme ich die Meldung: "Syntaxfehler in UPDATE-Anweisung". Ich bin mir aber fast sicher, dass der Syntax stimmen müsste.

    Ich hoffe, Ihr könnt mir weiterhelfen.

  • #2
    Hallo,

    Du hast recht: der eigentliche UPDATE-Befehl sieht nicht falsch aus. Aber es gibt ein paar Ungereimtheiten:
    • Wenn Du einen SQL-Befehl dem Konstruktor des DbDataAdapters übergibst, wird der als SelectCommand verstanden und eingetragen.
    • Der DbCommandBuilder erzeugt daraus die anderen Befehle, insb. UPDATE.
    • Es ist niemals gut, Werte direkt in einen SQL-Befehl per String-Verknüpfung einzubauen. Dazu sind Parameter zu benutzen. Siehe 24.3 Parametrisierte Abfragen

    Du solltest so vorgehen:
    • Erzeuge einen DbCommand mit dem eigentlichen Befehlstext.
    • Füge diesem die benötigten Parameter hinzu.
    • Der so erzeugte Befehl wird mit ExecuteNonQuery direkt ausgeführt.

    Der DbDataAdapter mit seinem Update-Befehl dient dazu, eine Reihe von (unterschiedlichen) Änderungen in der DataTable in einem Rutsch in die DB zu übertragen. Einheitliche Änderungen per Code sind dagegen direkt auszuführen.

    Bitte beachte: Ich spreche von Db-Klassen, im OpenBook werden Sql-Klassen benutzt, das musst Du in OleDb übersetzen. Die Parameter werden bei OleDb mit '?' gekennzeichnet, siehe dazu auch Parameter bei SQL-Befehlen: Unterschiede bei Oledb

    Gruß Jürgen

    Comment


    • #3
      Hallo Jürgen!
      Vielen Dank für deine Antwort!
      Ich hab das ganze wieder mit der Spalte PASSWORD versucht, doch da scheint es so, als wäre doch irgendwo ein Problem mit dieser Spalte...das muss ich mir noch genauer ansehen...

      EDIT: Das Problem mit der Spalte PASSWORD muss der Datentyp sein. Im Header der dbf.File ist die Spalte als Datentyp N mit der Länge 11 deklariert. Ich dachte, dass müsste NUMERIK sein, aber ich lieg wohl falsch....bis jetzt bin ich noch nicht dahinter gestiegen, was es wirklich für ein typ ist...

      Ich hab es dann einfach vorerst mit einer anderen Spalte (USERNAME) versucht....und siehe da, es klappt!

      Wirklich vielen vielen Dank, du hast mir extrem weitergeholfen!

      Hier nochmal der funktionierende Code:

      Code:
      Private Sub Save()
      Dim con As New System.Data.OleDb.OleDbConnection(OleDBConString & path  & ";Extended Properties=dBASE IV;User ID=Admin;Password=;")
      Dim cmd As New OleDbCommand
      cmd.CommandText = "UPDATE Table SET USERNAME = ?"
      cmd.Connection = con                      
      cmd.Parameters.Add(New OleDbParameter("USERNAME", OleDbType.Char, 8))
      cmd.Parameters("USERNAME").Value = "NewUsr"
      
      con.Open()
      MsgBox("Update durchgeführt für: " & cmd.ExecuteNonQuery() & " Datensätze")
      con.Close()
      
      
      End Sub
      Zuletzt editiert von NeonSchwarz; 05.03.2009, 16:40.

      Comment

      Working...
      X