2016-03-27 14 views
2

Was ist der richtige Weg, um eine lokale Datenbankdatei zu erstellen und dann die App damit zu verbinden? Ich möchte, dass es funktioniert, auch wenn Sie den Speicherort des Projektordners ändern.Alle Daten aus der Datenbank werden gelöscht, wenn die Anwendung geschlossen wird.

Richtig weiß, was ich tue ist: Projekt -> Neuen Artikel hinzufügen -> Service-basierte Datenbank und ich erstellen einen und dann gehe ich zu Daten -> Neue Datenquelle hinzufügen, füge ich die erstellte Datenbank und ich bekomme die Verbindung Zeichenfolge.

Ok, alles gut, ich kann es verbinden, wie ich es wünsche, aber alle meine Daten werden aus der Datenbank gelöscht, wenn ich die Anwendung schließe (nicht immer).

Zum Beispiel dieser Code:

SqlConnection c = new SqlConnection(@"DataSource=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\DB.mdf;Integrated Security=True;User Instance=True");   
c.Open(); 
SqlCommand cmd; 
cmd = new SqlCommand("CREATE TABLE Persons (id int primary key, nume char(20), age int)"); 
cmd.ExecuteNonQuery(); 
cmd = new SqlCommand("INSERT INTO Persons VALUES (@id, @name, @age)", c); 
cmd.Parameters.AddWithValue("@id", 1); 
cmd.Parameters.AddWithValue("@name", "Catalin"); 
cmd.Parameters.AddWithValue("@age", 20); 
cmd.ExecuteNonQuery(); 

Ich betreibe es erstmals die Tabelle und fügen Sie ein Element, um es zu erstellen und dann, dann, wenn ich es zum zweiten Mal ohne sqlcommand ausführen, um die Tabelle zu erstellen Personen, es sagt mir, dass es keine Personen Objekt, aber wenn ich das zweite Mal das Projekt mit dem gleichen Code läuft, sagt mir, dass es bereits ein Personen Objekt ...

Ich benutze Visual C# Express Edition 2010.

+0

Starten Sie Ihr Programm, indem Sie auf "Debuggen starten" klicken und befindet sich Ihre .mdf im Ordner "Bin"? Wenn ja, wird vielleicht Ihre .mdf Datei jedes Mal überschrieben, wenn Sie Ihr Programm erstellen/ausführen. –

+0

[Marc Antwort] (http://Stackoverflow.com/a/36245969/447156) ist ganz richtig. Auch schlage ich vor, ['using' Statement] (https://msdn.microsoft.com/en-us/library/yh598w02.aspx) zu verwenden, um Ihre Verbindung und Ihren Befehl automatisch zu entfernen, und es wäre besser,' Add' Methode zu verwenden mit Angabe des Parametertyps und dessen Größe anstelle von 'AddWithValue', da [it _might_ manchmal unerwartete Ergebnisse generiert] (http://blogs.msmvps.com/jcoehoorn/blog/2014/05/12/can-we-stop-using-) addwithvalue-bereits /). –

Antwort

7

Das ganze User Instance und AttachDbFileName = Ansatz ist fehlerhaft - im besten Fall! Wenn Sie Ihre App in Visual Studio ausführen, kopiert sie die Datei .mdf (von Ihrem Verzeichnis App_Data zum Ausgabeverzeichnis - normalerweise .\bin\debug - wo Ihre App läuft) und höchstwahrscheinlich, Ihre INSERT funktioniert gut - aber Sie sind nur Blick auf die falsche .mdf-Datei am Ende!

Wenn Sie mit diesem Ansatz bleiben wollen, dann versuchen Sie einen Breakpoint auf dem myConnection.Close() Aufruf setzen - und dann überprüfen Sie die .mdf Datei mit SQL Server Mgmt Studio Express - Ich bin fast sicher, dass Ihre Daten gibt.

Die wirkliche Lösung meiner Meinung nach würde

  1. installieren SQL Server Express sein (und Sie haben bereits das sowieso getan)

  2. installieren SQL Server Management Studio Express

  3. Erstellen Sie Ihre Datenbank in SSMS Express, geben Sie einen logischen Namen (z. B. MyDatabase)

  4. verbinden Sie es mit seiner logischen Datenbank Name (gegeben, wenn Sie es auf dem Server erstellen) - und nicht mit physischen Datenbankdateien und Benutzerinstanzen rum. In diesem Fall würde die Verbindungszeichenfolge so etwas wie:

    Data Source=.\\SQLEXPRESS;Database=MyDatabase;Integrated Security=True 
    

    und alles andere ist genau das gleiche wie vorher ...

Auch Aaron Bertrandsche ausgezeichnete Blog-Post Bad habits to kick: using AttachDbFileName für mehr sehen Hintergrundinformation.

+0

Ich mag die Lösung, die Sie mir gegeben haben, aber leider kann ich nichts anderes als Visual Studio verwenden (Ich bereite mich auf einen Wettbewerb vor, und ich darf nichts anderes als Visual Studio installieren). Gibt es eine Möglichkeit, ich kann eine MDF-Datei erstellen, legen Sie sie irgendwo in den Projektordner und verbinden Sie sich dann mit ihm, indem Sie den Speicherort im Projektordner? Das wäre perfekt. –

+0

@CatalinHoha: Wenn Sie eine '.mdf' Datei verwenden, müssen Sie ** auch SQL Server installiert haben - Visual Studio alleine kann nicht mit' .mdf' Dateien arbeiten. –

1

Ändern der kopieren Ausgabeverzeichnis Einstellung von Kopieren immer zu Kopieren, falls neuere in der Eigenschaftenseite für die Datenbank-Dateien. Jedes Mal, wenn Sie die Anwendung ausführen, wird die neue Datenbankdatei von Ihrem Projekt in den Ordner bin kopiert, sodass alle Ihre Daten aus dem vorherigen Lauf entfernt werden.

Mehr: https://msdn.microsoft.com/en-us/library/ms246989.aspx

0

dachte ich, eine ziemlich einfache Antwort, aber vielleicht ist es nicht die beste Verwendung es auf diese Weise zu tun. Wie auch immer, ich die Datenbank in das Projekt ein und dann schließe ich es direkt so tun:

string path = Path.GetDirectoryName(Path.GetDirectoryName(Directory.GetCurrentDirectory))); 
SqlConnection c = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=""" + path + @"Database1.mdf"";Integrated Security=True;User Instance=True"); 

Auf diese Weise, wenn Sie Ihr Projekt zwischen mehreren PCs bewegen, noch die Verbindung funktioniert (ich brauchte dies die die meisten). Dies funktioniert auch mit. SDF-Dateien und es ist auch einfacher.

Verwandte Themen