DataSet to MSAccess2007 - Wie speichert man ein Datum?

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von rdmguy.

    DataSet to MSAccess2007 - Wie speichert man ein Datum?

    Hallo,

    ich möchte ein Datum aus einem DataSet in eine AccessDB speichern.

    Ich arbeite mit der Klasse aus dem Thema Dataset->Db von @ErfinderDesRades und habe eigentlich alles gemacht wie es da stand, d.h. TabelAdapter runterschmeißen und mit der OleDbPersistance Klasse Laden und Speichern.

    Das funktioniert bei Zahlen und Text, aber ein Datum kann ich nicht abspeichern. Wenn ich ein Datum in die AccessDB eintrage, dann wird es korrekt geladen und auch angezeigt, nur zurück Speichern geht halt nicht :(

    Es kommt folgender Fehler:
    Spoiler anzeigen
    Ein Ausnahmefehler des Typs "System.Data.OleDb.OleDbException" ist in System.Data.dll aufgetreten.

    Zusätzliche Informationen: Syntaxfehler in der INSERT INTO-Anweisung.


    Code zum Speichern aus der OleDbPersistance Klasse:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Sub Save()
    2. _Con.Open()
    3. For Each tb In _RankedTables
    4. Dim rows = tb.Select("", "", DataViewRowState.Added Or DataViewRowState.ModifiedCurrent)
    5. _Adapters(tb).Update(rows) ' first send Inserts and Updates
    6. Next
    7. Dim skipSubOrderedRowsConfig = New _AcceptruleCascadeConfig(_dts)
    8. For Each tb In _RankedTables
    9. Dim n = _Adapters(tb).Update(tb) ' send the remaining Deletes, skipping Cascade-Deleted-Rows, which will be deleted by Db itself
    10. Next
    11. skipSubOrderedRowsConfig.Restore()
    12. _Con.Close()
    13. End Sub


    Der Fehler tritt in der Zeile _Adapters(tb).Update(rows) auf.

    Ich möchte das Datum gerne im Format: 22.11.2015 17:14:15 abspeichern. Dazu habe ich in Access das Datumsformat auf "Standarddatum" gestellt und im DataSet wurde es beim Erstellen richtigerweise auf DateTime gestellt.

    Kann mir bitte jemand sagen was ich ändern muss, um mit der Speichern Methode auch Datumswerte richtig zu speichern? Danke :)

    Nachtrag: Wenn der Fehler kommt, dann wird die Verbindung zur DB nicht mehr geschlossen. Ich denke es hat einen Grund das kein TryCatchFinally da ist, nur das die Verbindung offen bleibt, ist auch nicht so dolle. Wie kann ich das fixen?

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

    rdmguy schrieb:

    Wenn der Fehler kommt, dann wird die Verbindung zur DB nicht mehr geschlossen. Ich denke es hat einen Grund das kein TryCatchFinally da ist, nur das die Verbindung offen bleibt, ist auch nicht so dolle. Wie kann ich das fixen?
    Das ist durchaus dolle.
    also es ist völlig schnuppe, wenn beim Debuggen das Prog abstürzt, dass dann die Verbindung nicht korrekt geschlossen wird.
    Löse da Problem, dann ist auch das Folge-Problem vom Tisch.

    Allerdings kann ich zum Problem selbst nix sagen, ich hab ja weder deine Access-Db, noch dein Programm.

    Was vlt. hilfreich wäre, wenn du den CommandText herausfinden könntest, welcher an die Db gesendet wird. vlt. so:

    VB.NET-Quellcode

    1. dim adptr= _Adapters(tb)
    2. Dim n = adptr(tb) ' send the remaining Deletes, skipping Cascade-Deleted-Rows, which will be deleted by Db itself
    3. 'und jetzt im Lokalfenster das Insert-Command von adptr untersuchen

    Hallo,

    Die Klasse funktioniert perfekt.

    Es lag wohl an dem Datumsfeld in der Access, welches ich "Timestamp" genannt hatte. Zumindest nach dessen Umbenennung ging es sofort.

    Komisch halt, dass ers geladen hat, aber Speichern nicht ging... Naja, hauptsache es läuft jetzt :)
    Ja, das ist ein Mangel am CommandBuilder, bzw. dass DbPersistance da keinen Workaround hat:
    Der CommandBuilder erzeugt idiotischerweise einen CommandText, der die Tabellen-/Spalten-Namen nicht escaped. In Folge werden reservierte Worte wie Timestamp - aber es gibt glaub an die 100 weitere reservierte Worte! - falsch interpretiert.

    Edit: hab jetzt eine probate Lösung gefunden - man kann dem CommandBuilder die Quotes angeben, dann generiert er auch vernünftige Commands:

    VB.NET-Quellcode

    1. Dim cmb = New OleDbCommandBuilder(adp)
    2. cmb.QuotePrefix = "`"
    3. cmb.QuoteSuffix = "`"
    (ich hoffe, du findest die Stelle, wo das hingehört)

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

    Hi. Danke für die Verbesserung.

    Ich habe es in den Konstruktor eingefügt, da keine Fehler kam und Laden + Speichern ging, nehme ich an das es so richtig ist. Falls nicht bitte bescheid sagen. :)
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Sub New(connectionString As String, dts As DataSet)
    2. _dts = dts
    3. _Con = New OleDbConnection(connectionString)
    4. _RequeryIdCommand = New OleDbCommand("SELECT @@IDENTITY", _Con)
    5. _hshTempTables = New HashSet(Of DataTable)(_dts.Tables.Cast(Of DataTable))
    6. While _hshTempTables.Count > 0 : BuildRankedTables(_hshTempTables.First) : End While
    7. _Adapters = New Dictionary(Of DataTable, OleDbDataAdapter)
    8. For Each tb In _RankedTables
    9. Dim adp = New OleDbDataAdapter("Select * from [" & tb.TableName & "]", _Con)
    10. Dim cmb = New OleDbCommandBuilder(adp)
    11. cmb.QuotePrefix = "`"
    12. cmb.QuoteSuffix = "`"
    13. If tb.PrimaryKey.Length = 1 AndAlso tb.PrimaryKey(0).AutoIncrement Then
    14. AddHandler adp.RowUpdated, AddressOf Table_RowUpdated ' not neccessary, if in-/out-DbParameter-Support is present
    15. End If
    16. _Adapters.Add(tb, adp)
    17. Next
    18. End Sub