DataSet nach Access zurück schreiben

  • VB.NET

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von commander.

    DataSet nach Access zurück schreiben

    Moin Moin :)

    Ich versuche eine CSV Datei in eine Access DB (mdb) zu importieren...

    Dazu lade ich mir die mdb und die CSV_Datei in ein Dataset (DS). Das funktioniert auch einwandfrei...
    Nun möchte ich das DS zurück schreiben DataAdapter_Stammdaten.Update(DS).
    Dabei erhalte ich aber folgende Fehlermeldung: Dynamische SQL-Generierung für den UpdateCommand wird nicht für einen SelectCommand unterstützt, der keine Schlüsselspalteninformationen zurückgibt.
    Ich gehe mal davon aus, dass die Schlüsselspalteninformationen der Primärschlüssel ist?! In der mdb kann ich aber keinen Primärschlüssel setzten,
    da es keine Spalte mit eindeutigem Inhalt gibt...

    Gibt es hier sonst eine andere Lösung, bzw kann man den Primärschlüssel umgehen?

    Hier mein Code:

    VB.NET-Quellcode

    1. Dim Connect_Stammdaten As New OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=""pfad_zur_mdb""")
    2. Dim Command_Stammdaten As New OleDb.OleDbCommand("select * from Auftrags_Stammdaten_Test", Connect_Stammdaten)
    3. Dim DataAdapter_Stammdaten As New OleDb.OleDbDataAdapter
    4. Dim csvdatei = "\\pfad_zur_csv\"
    5. Dim Connect_csvdatei As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & csvdatei & ";Extended Properties='text;HDR=Yes;FMT=Delimited;';")
    6. Dim Command_csvdatei As New OleDb.OleDbCommand("SELECT * FROM stammdaten_bearbeitet.txt", Connect_csvdatei)
    7. Dim DataAdapter_csvdatei As New OleDb.OleDbDataAdapter
    8. Dim CommandBuilder As OleDbCommandBuilder = New OleDbCommandBuilder(DataAdapter_Stammdaten)
    9. Connect_Stammdaten.Open()
    10. Connect_csvdatei.Open()
    11. DataAdapter_Stammdaten.SelectCommand = Command_Stammdaten
    12. DataAdapter_Stammdaten.Fill(DS)
    13. DataAdapter_csvdatei.SelectCommand = Command_csvdatei
    14. DataAdapter_csvdatei.Fill(DS)
    15. dt = DS.Tables(0)
    16. DGV.DataSource = dt 'Nur als Hilfsansicht
    17. CommandBuilder.GetUpdateCommand()
    18. DataAdapter_Stammdaten.Update(DS)
    19. Connect_Stammdaten.Close()
    20. Connect_csvdatei.Close()


    Danke schon mal :thumbsup:

    Grüße Dominik

    Mono schrieb:

    Wie willst du etwas updaten, wenn du keine Informationen hast, was wo upgedated werden soll?
    Du kannst dann maximal ein insert durchführen.


    Ich fülle doch ein DataSet mit 2 verschiedenen Quellen. Ich lasse mir die Daten ja in nem DGV anzeigen und da stehen die Daten so drin, wie ich sie gern zurückgeschrieben haben möchte.
    Bei CommandBuilder.GetUpdateCommand() kommt der Fehler, dass ich keinen Primärschlüssel hab, den ich ja auch nicht vergeben kann...

    commander schrieb:

    Mono schrieb:

    Wie willst du etwas updaten, wenn du keine Informationen hast, was wo upgedated werden soll?
    Du kannst dann maximal ein insert durchführen.


    Ich fülle doch ein DataSet mit 2 verschiedenen Quellen. Ich lasse mir die Daten ja in nem DGV anzeigen und da stehen die Daten so drin, wie ich sie gern zurückgeschrieben haben möchte.
    Bei CommandBuilder.GetUpdateCommand() kommt der Fehler, dass ich keinen Primärschlüssel hab, den ich ja auch nicht vergeben kann...

    Woher soll dann der Commandbuilder bei einem Update wissen welche Datensätze betroffen sind, ohne Eindeutigkeit?
    Ich würde das Datatable mit For Each durchlaufen und jeden Datensatz einzelt wegschreiben
    Wenn du 10 Zeilen hast, und keine davon ist durch etwas eindeutig zu identifizieren. Dann holst du dir die 10 Zeilen, veränderst sie und willst sie zurück schreiben.
    Wie soll das gehen? Es ist unmöglich zu wissen welche Zeile welche ist, ohne einen eindeutigen Schlüssel zu haben, der die Zeile als eben diese Zeile identifiziert. Denn in der Theorie könnten von den 10, 3 anfangs komplett identisch sein und du änderst 2 von den 3 identischen. Welche 2 sind das?
    Das ist eines der Grundprinzipien von Datenbanken. Im Schlimmsten Fall verwendet man wie von Schoofi vorgeschlagen eine extra Identity Spalte die einfach nur von 1 nach oben zählt und als Primärschlüssel fungiert.
    Denn darüber kann man die gesamte Zeile EINDEUTIG erkennen.

    Was man theoretisch auch noch machen kann ist sich alle Zeilen holen. Diese ändern. Alle Datensätze in der Datenbank löschen und dann die geänderten einfügen. Könnte von der Performance her sogar besser sein, wenn es keine Indices gibt.

    LG
    Das ist meine Signatur und sie wird wunderbar sein!

    Mono schrieb:

    Was man theoretisch auch noch machen kann ist sich alle Zeilen holen. Diese ändern. Alle Datensätze in der Datenbank löschen und dann die geänderten einfügen. Könnte von der Performance her sogar besser sein, wenn es keine Indices gibt.


    Ohne Primärschlüssel bekomm ich da die selbe Fehlermeldung...

    Ich hab es jetzt mit nem Insert-Befehl gelöst, so wie @EpagneulBreton es geschrieben hat.
    Nur hab ich noch ein kleines Problem. In der CSV Datei sind 2 Datumsspalten immer leer. Wenn der Insert-Befehl ausgeführt wird, bekomme ich die Meldung:
    Datentypen in Kriterienausdruck unverträglich
    Gebe ich ein fiktivies Datum vor, läuft der Insert sauber durch. Ich hätte das aber lieber, dass die beiden Spalten in der DB leer bleiben, was ja auch funktionieren muss,
    da, wenn ich die Daten der CSV per Hand über Access in die DB importiere, auch leer sind...
    Leider auch nicht...

    Visual Basic-Quellcode

    1. Command_Stammdaten = New OleDbCommand("INSERT INTO Auftrags_Stammdaten_Test VALUES ('" & AUFTRAGSNUMMER & "', '" & AENDERUNGS_BETR_NR & "', '" & System.DBNull.Value & "', '" & RECHNUNGSDATUM & "', '" & RECHNUNGSNUMMER & "', '" & FAHRGESTELL_NR & "', '" & KUNDENNUMMER & "', '" & System.DBNull.Value & "', '" & KENNZEICHEN & "', '" & NACHNAME & "', '" & BELEGART & "')", Connect_Stammdaten)

    commander schrieb:

    Leider auch nicht...

    Visual Basic-Quellcode

    1. Command_Stammdaten = New OleDbCommand("INSERT INTO Auftrags_Stammdaten_Test VALUES ('" & AUFTRAGSNUMMER & "', '" & AENDERUNGS_BETR_NR & "', '" & System.DBNull.Value & "', '" & RECHNUNGSDATUM & "', '" & RECHNUNGSNUMMER & "', '" & FAHRGESTELL_NR & "', '" & KUNDENNUMMER & "', '" & System.DBNull.Value & "', '" & KENNZEICHEN & "', '" & NACHNAME & "', '" & BELEGART & "')", Connect_Stammdaten)

    Für mich sieht der SQL String auch komisch aus, aber mit fehlen da auch die Erinnerungen an diese SQL String Gefrickel.
    Am Besten ist es mit Parametern zu arbeiten.
    Sorry, Ich bin dann leider raus, da ich SQL String Erstellung keine Efahrungen habe.