none
SqlServerCompact Insert RRS feed

  • Frage

  • Hallo zusammen,

    in meine SqlServerCompact Datenbank möchte ich Datensätze einfügen. Zunächst zum Testen habe ich mir eine Tabelle "Test" erstellt mit zwei Datensätzen:ID - int und Name - varchar. Ich verwende als Entwicklungsumgebung VisualStudio 2012.

    Anzeigen im DataGrid der WPF via TableAdapter klappt problemlos, das Einfügen aber nicht.

    Ich habe dafür folgenden Code:

                RiskAnalyzerDatabaseDataSetTableAdapters.TestTableAdapter ta = new RiskAnalyzerDatabaseDataSetTableAdapters.TestTableAdapter();
                ta.Insert(1, "eins");

    Es kommen keine Fehlermeldungen, bei den GenerateDBDirectMethods ist ein Haken gesetzt, damit auch Update und Delete erstellt werden, der TableAdapterKonfigurations-Assistent gibt an , dass INSERT, ... -Methoden erstellt wurden. Trotzdem findet sich die Zeile nicht in der Tabelle.

    Wo liegt der Fehler?

    Gruß

    Ottilie Steinhauer

    Mittwoch, 15. Mai 2013 19:17

Antworten

  • Hallo Ottilie,

    das tun sie auch, wenn die Datenbank später mit der Anwendung ausgeliefert wird. Dann gibt es nur eine Instanz der Datenbank (in einem Benutzerverzeichnis).

    Bei der Entwicklung geht Visual Studio davon aus, dass man die Testendatenbank nicht "verschmutzen" will. Deswegen wird jeweils eine "frische" Kopie in das Verzeichnis kopiert.

    Der Datenbank-Explorer wiederum dient zum Entwerfen der Datenbankstruktur und ggf. dem Hinterlegen von Vorgabedaten.

    Das ist auch ein Grund für "|DataDirectory|" - Du erinnerst sicher noch: Working with local databases

    (Hier vor allem: Where is my data? -- Understanding the file copy for desktop projects)

    Gruß Elmar

    • Als Antwort vorgeschlagen Ionut DumaModerator Dienstag, 21. Mai 2013 15:09
    • Als Antwort markiert ottilie Dienstag, 21. Mai 2013 16:13
    Donnerstag, 16. Mai 2013 07:50

Alle Antworten

  • Trotzdem findet sich die Zeile nicht in der Tabelle.

    Hallo Ottilie,

    so eine richtige SQL Server (Express) bezogene Frage ist es nicht gerade, sondern eher eine in Richtung .NET/Ado.NET; ein entsprechend anders Forum ware besser geeignet für die Frage. Aber ich kenne da einen, der auch hier mitliest und wie immer die Frage bestens beantworten kann & wird ...;-)

    Mit meinen nicht ganz so kompetenten Kenntnissen: Ein DataSet/DataAdapter arbeitet offline, wenn Änderungen an den Daten an die Datenquelle übertragen werden, muss man das explizit initiieren; siehe Gewusst wie: Ausführen eines Commit für Änderungen in einem Dataset; ob nun SQL Server oder Compact, das Prinzip ist immer gleich.


    Olaf Helper

    Blog Xing

    Mittwoch, 15. Mai 2013 19:37
  • Hallo Ottilie,

    hast Du danach einen Abruf (Fill) für die gebundene DataTable durchgeführt?

    Direkt Befehle wie Insert fügen direkt in die Datenbank ein, aktualisieren aber keine (gebundenen) DataTable/DataSet Instanzen.

    Gruß Elmar

    Mittwoch, 15. Mai 2013 20:36
  • Hallo Elmar,

    vielen Dank für Deine schnelle Antwort. Den Aufruf  ta.Fill(ds.Test); hatte ich noch nicht. Seither wird in der Tabelle tatsächlich die Zeile

    1        eins

    angezeigt, bei mehrfachem Aufruf auch mehrfach. Schaue ich aber via ServerExplorer in der Tabelle nach, ist dort nichts. Erneuter Aufruf des Programms zeigt dann aber auch nur die neu eingefügte Zeile, alle anderen sind nicht mehr da.

    Was fehlt jetzt noch?

    Gruß

    Ottilie

    Donnerstag, 16. Mai 2013 06:43
  • Hallo Ottilie,

    wenn Du die Datenbank in das Projekt eingebunden hast, musst Du darauf achten, in die "richtige" Datenbank-Datei zu schauen.

    Zur Laufzeit wird die Datenbankdatei in das Programmverzeichnis (bin\Debug) kopiert und die Anwendung verändert diese.

    Während im Datenbank-/Server-Explorer die Datenbankdatei im Projektverzeichnis angezeigt wird. Die behält ihren Originalzustand.

    Gruß Elmar

    Donnerstag, 16. Mai 2013 06:54
  • Hallo Elmar,

    jetzt bin ich aber nicht schlau geworden. Die Daten sollen nicht nur temporär eingefügt und im datagrid angezeigt werden, sie sollen hinterher in der Datenbank dauerhaft gespeichert werden. Und das funktioniert eben nicht. Die Daten müsssten also im Datenbank/Server-Explorer erscheinen, mindestens nach Schließen der Anwendung.

    Gruß

    Otti

    Donnerstag, 16. Mai 2013 07:10
  • Hallo Ottilie,

    das tun sie auch, wenn die Datenbank später mit der Anwendung ausgeliefert wird. Dann gibt es nur eine Instanz der Datenbank (in einem Benutzerverzeichnis).

    Bei der Entwicklung geht Visual Studio davon aus, dass man die Testendatenbank nicht "verschmutzen" will. Deswegen wird jeweils eine "frische" Kopie in das Verzeichnis kopiert.

    Der Datenbank-Explorer wiederum dient zum Entwerfen der Datenbankstruktur und ggf. dem Hinterlegen von Vorgabedaten.

    Das ist auch ein Grund für "|DataDirectory|" - Du erinnerst sicher noch: Working with local databases

    (Hier vor allem: Where is my data? -- Understanding the file copy for desktop projects)

    Gruß Elmar

    • Als Antwort vorgeschlagen Ionut DumaModerator Dienstag, 21. Mai 2013 15:09
    • Als Antwort markiert ottilie Dienstag, 21. Mai 2013 16:13
    Donnerstag, 16. Mai 2013 07:50
  • Hallo Elmar,

    erstmal ganz herzlichen Dank für die ausführliche Hilfe. Das hat mir schon sehr weiter geholfen. Dies ist für mich das erste Projekt mit SQLServerCompact und mir kommen immer viele Fragen.

    Nur um ganz sicher zu gehen, dass ich alles richtig verstanden habe: VisualStudio erstellt eine Arbeitskopie der Datenbank und legt sie in Projektname ->bin ab. Nur diese Kopie wird verwendet. Sie behält Ihre Daten auch über VisualStudio schließen und/oder Computer neu starten (habe ich alles ausprobiert) Lediglich, falls ich die Tabelle im ServerExplorer öffne, wird die Kopie mit dieser Tabelle überschrieben, in diesem Fall geleert, weil die Tabelle im ServerExplorer leer ist.

    Wird das Programm mit Installer ausgeliefert, besitzt es nur eine Datenbank, die dann gefüllt werden kann und die Daten dauerhaft speichert. Soweit zumindest in der Theorie OK?

    Gruß

    Otti


    • Bearbeitet ottilie Donnerstag, 16. Mai 2013 09:52
    Donnerstag, 16. Mai 2013 09:52