Warum speichern von änderungen an einer Datenbank schlägt fehl?
Habe ich folgende C# - code in eine Konsolenanwendung.
Immer wenn ich Debuggen Sie die Anwendung, und führen Sie die Abfrage1 (fügt einen neuen Wert in der Datenbank) und führen Sie dann query2 (zeigt alle Einträge in der Datenbank), kann ich den neuen Eintrag zu sehen, die ich eingefügt klar. Allerdings, wenn ich schließen Sie die Anwendung und überprüfen Sie die Tabelle in der Datenbank (Visual Studio), es ist Weg. Ich habe keine Ahnung, warum es nicht speichern.
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.SqlServerCe;
using System.Data;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
try
{
string fileName = "FlowerShop.sdf";
string fileLocation = "|DataDirectory|\\";
DatabaseAccess dbAccess = new DatabaseAccess();
dbAccess.Connect(fileName, fileLocation);
Console.WriteLine("Connected to the following database:\n"+fileLocation + fileName+"\n");
string query = "Insert into Products(Name, UnitPrice, UnitsInStock) values('NewItem', 500, 90)";
string res = dbAccess.ExecuteQuery(query);
Console.WriteLine(res);
string query2 = "Select * from Products";
string res2 = dbAccess.QueryData(query2);
Console.WriteLine(res2);
Console.ReadLine();
}
catch (Exception e)
{
Console.WriteLine(e);
Console.ReadLine();
}
}
}
class DatabaseAccess
{
private SqlCeConnection _connection;
public void Connect(string fileName, string fileLocation)
{
Connect(@"Data Source=" + fileLocation + fileName);
}
public void Connect(string connectionString)
{
_connection = new SqlCeConnection(connectionString);
}
public string QueryData(string query)
{
_connection.Open();
using (SqlCeDataAdapter da = new SqlCeDataAdapter(query, _connection))
using (DataSet ds = new DataSet("Data Set"))
{
da.Fill(ds);
_connection.Close();
return ds.Tables[0].ToReadableString(); //a extension method I created
}
}
public string ExecuteQuery(string query)
{
_connection.Open();
using (SqlCeCommand c = new SqlCeCommand(query, _connection))
{
int r = c.ExecuteNonQuery();
_connection.Close();
return r.ToString();
}
}
}
EDIT: Vergaß zu erwähnen, dass ich mit SQL Server Compact Edition 4 und VS2012 Express.
Tun Sie Gerät Debuggen oder emulator?
debug-Schaltfläche in der visual studio (eine, die aussieht wie eine play-Taste) @kostasch.
Sorry, ich dachte, Sie Debuggen eine mobile app. Ich denke, ich erinnere mich, wie die Schaltfläche "Debuggen" aussieht :).
Ihre einfügen auf Datenbank und wählen Sie Ihre Produkte. Ir ist durch copy paste Fehler?
Copy paste Fehler . behoben. thx für die Erwähnung.
debug-Schaltfläche in der visual studio (eine, die aussieht wie eine play-Taste) @kostasch.
Sorry, ich dachte, Sie Debuggen eine mobile app. Ich denke, ich erinnere mich, wie die Schaltfläche "Debuggen" aussieht :).
Ihre einfügen auf Datenbank und wählen Sie Ihre Produkte. Ir ist durch copy paste Fehler?
Copy paste Fehler . behoben. thx für die Erwähnung.
InformationsquelleAutor Joe Slater | 2013-06-17
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist ein ganz Allgemeines problem. Verwenden Sie die |DataDirectory| Ersatzzeichenfolge. Dies bedeutet, dass beim Debuggen Sie Ihre app in Visual Studio-Umgebung, die die Datenbank verwendet, die durch Ihre Anwendung befindet sich in den Unterordner
BIN\DEBUG
Ordner (oder der x86-Variante) des Projekts. Und das funktioniert gut, da Sie nicht jede Art von Fehler beim verbinden mit der Datenbank machen und update-Operationen.Aber dann beenden Sie die debug-Sitzung, und schauen Sie Ihre Datenbank über die Visual Studio-Server-Explorer (oder einem anderen geeigneten Werkzeug). Dieses Fenster hat eine andere Verbindungszeichenfolge (vermutlich Hinweis auf Kopie Ihrer Datenbank im Projekt-Ordner). Sie suchen Ihre Tabellen und Sie sehen nicht die änderungen.
Dann ist das problem noch schlimmer. Man neu starten, VS auf die Jagd gehen für die Fehler in der app, aber Sie haben Ihre Datenbank-Datei aufgelistet, die zwischen Ihre Projekt-Dateien und die Eigenschaft
Copy to Output directory
eingestellt istCopy Always
. An diesem Punkt Visual Studio verpflichtet und Kopien der ursprünglichen Datenbank-Datei aus dem Projekt Ordner, um die Ausgabe-Ordner (BIN\DEBUG) und damit Ihre bisherigen änderungen verloren.Nun, Ihre Anwendung inserts/updates wieder das Ziel-Tabelle, die Sie wieder nicht finden können, irgendwelche Fehler in Ihrem code und starten Sie die Schleife erneut aus, bis Sie entscheiden, zu veröffentlichen oder zu suchen auf StackOverflow.
Könnten Sie halt dieses problem beim ändern der Eigenschaft
Copy To Output Directory
zuCopy If Newer
oderNever Copy
. Auch Sie können aktualisieren Sie Ihre connectionstring in der Server-Explorer zu suchen, an der Arbeitskopie Ihrer Datenbank oder erstellen Sie eine zweite Verbindung. Die erste, noch Punkte, um die Datenbank in den Ordner des Projekts, während der zweite Punkte, um die Datenbank in den Ordner BIN\DEBUG. Auf diese Weise können Sie halten Sie die original-Datenbank für die Bereitstellung bereit ist Zwecken und schema-änderungen, während mit der zweiten Verbindung, die Sie könnten Blick auf die effektiven Ergebnisse Ihrer Anstrengungen Codierung.BEARBEITEN Besondere Warnung für MS-Access Datenbank-Benutzer. Der einfache Akt der Blick auf Ihre Tabelle ändert sich das änderungsdatum der Datenbank, AUCH wenn Sie nicht schreiben oder irgendetwas zu ändern. Also die Flagge
Copy if Newer
kicks und die Datenbank-Datei wird in das Ausgabeverzeichnis kopiert. Mit Access besser zu nutzenCopy Never
.InformationsquelleAutor Steve
Begehen änderungen speichern /änderungen in debug-Sitzungen ist ein bekanntes Thema in der SQL CE-Foren. Es ist etwas, das Reisen schon ein paar Leute. Ich werde nach links zur Quelle der unten aufgeführten Artikel, sondern ich wollte fügen Sie die Antwort, scheint die besten Ergebnisse zu erhalten zu die die meisten Menschen:
Haben Sie mehrere Optionen, um dieses Verhalten zu ändern. Wenn Ihre sdf-Datei ist Teil der Inhalte des Projekts, dies wird beeinflussen, wie Daten persistent gespeichert werden. Denken Sie daran, dass, wenn Sie Debuggen, alle Ausgaben des Projekts (einschließlich der sdf), wenn im bin/debug Ordner.
Können Sie entscheiden, nicht zu zählen die sdf-Datei als Teil des Projekts, und verwalten Sie den Speicherort der Datei runtime.
Wenn Sie mit "kopieren, wenn neuer", und Projekt-änderungen, die Sie machen, um die Datenbank zu überschreiben, Laufzeit/Debuggen änderungen.
Wenn Sie mit "nicht kopieren", müssen Sie geben Sie den Speicherort im code (als zwei Ebenen über, wo das Programm ausgeführt wird).
Wenn du "immer Kopieren", werden sämtliche änderungen während der Laufzeit werden immer überschrieben
Antwort Quelle
Hier ist ein link um einige weitere Diskussion und wie die Dokumentation.
InformationsquelleAutor Ray K