2016-03-30 5 views
0

Ich habe ein Problem, dass, wenn ich Datenbank erstellen und seinen Namen angeben will, es im angegebenen Verzeichnis und im Verzeichnis erstellt wird, in dem die Anwendung ausgeführt wird. Warum passiert das?Sqlite C# erstellt 2 gleichnamige Datenbanken

Code, die Datenbank erstellt:

private static string AddDb(string dbName, string dbPassword) 
    { 
     try 
     { 
      string startupPath = Environment.CurrentDirectory; 
      string dataBasePath = startupPath + "\\DB\\" + dbName; 
      SQLiteConnection.CreateFile(dataBasePath); 
      SQLiteConnection dbConnString; 
      dbConnString = new SQLiteConnection("Data Source =" + dbName + ";Version=3;"); 
      dbConnString.Open(); 
      dbConnString.ChangePassword(dbPassword); 
      dbConnString.Close(); 
      return dataBasePath; 
     } 
     catch 
     { 

      MessageBox.Show("Failed to create database", "DB Creator"); 
      return ""; 
     } 
    } 
+0

es scheint, dass dieser Aufruf dbConnString.Open() eine sQLite-Datei in exe-Verzeichnis erzeugt wird; – phoenix

Antwort

-1

Die Environment.CurrentDirectory enthält das Verzeichnis, das die Anwendung von standardmäßig gestartet. Sie können diese Eigenschaft festlegen. Siehe den MSDN Artikel Environment.CurrentDirectory Property

+0

Falsch auch. Es enthält nicht immer das Verzeichnis, von dem aus die Anwendung gestartet wird, sondern das aktuelle Arbeitsverzeichnis, das etwas ganz anderes ist. Siehe http://stackoverflow.com/questions/15653921/get-current-folder-path –

+0

Ja, tut es. Wenn Sie eine einfache Anwendung zum Drucken erstellen, wird das Verzeichnis ausgegeben, in dem die Anwendung gestartet wird. Er verwendet die Environment-Klasse und nicht die Directory-Klasse. Sie können auch das Environment.CurrentDirectory ändern. Zumindest mit Framework 4.5.2 und 4.6.1. Hätte er es ändern können, ohne es zu merken? – Wrongway

+0

Wenn Sie eine Verknüpfung zu Ihrer einfachen App erstellen und ein anderes Arbeitsverzeichnis angeben, funktioniert dies nicht. Die Dokumente sprechen auch über das * working * -Verzeichnis. Wie dem auch sei, Anwendungen, die im Ordner "Programme" installiert sind, können dort trotzdem nicht schreiben, daher sollte das OP trotzdem einen geeigneten Speicherort verwenden. –

1

Das Problem scheint zu sein, dass Sie verschiedene Pfade in CreateFile und Ihre Verbindungszeichenfolge verwenden.

Wenn Sie sich Ihren Code unten ansehen, werden Sie feststellen, dass Sie in einem Fall einen vollständigen Pfad zum Erstellen der Datei verwenden (databaseBasePath), während Sie im anderen Fall nur den Namen der Datenbankdatei in der Verbindungszeichenfolge verwenden (dbName)). Ohne einen absoluten Pfad, kann dies ein anderer Ordner sein!

string dataBasePath = startupPath + "\\DB\\" + dbName; 
SQLiteConnection.CreateFile(dataBasePath); 
SQLiteConnection dbConnString; 
dbConnString = new SQLiteConnection("Data Source =" + dbName + ";Version=3;"); 

Es scheint wie Open dann die Datei erstellt, wenn sie es nicht finden können.

Ein Wort auf den Pfaden:

  1. Sie sind nicht die Program Files Ordner schreiben erlaubt, so die aktuellen Ordner für die Datenbank-Datei ist wirklich eine schlechte Idee.
  2. Die Verwendung von Environment.CurrentDirectory ist auch eine schlechte Idee. Je nachdem, wie Sie Ihre Anwendung starten, ist dies möglicherweise der Ordner, den Sie denken, oder nicht (siehe meine Kommentare zu den anderen Antworten und this).
  3. Gehen Sie niemals davon aus, dass \ eigentlich der Pfadtrenner ist. Verwenden Sie stattdessen Path.Combine.

Ich schlage vor, dass Sie Environment.GetFolderPath verwenden, um einen Standort zu erhalten, die von allen Benutzern gemeinsam genutzt werden, um die aktuellen Benutzer (wenn die Datenbank-Inhalte geteilt werden sollen) oder privat (wenn alle Benutzer ihre eigene Datenbank haben sollen) und erstellen Sie die Datenbank dort:

string baseFolder = Environment.GetFolderPath(<wherever it should be>); 
string dataBasePath = Path.Combine(baseFolder, "DB", dbName); 
SQLiteConnection.CreateFile(dataBasePath); 
SQLiteConnection dbConnString = new SQLiteConnection(String.Format("Data Source = {0};Version=3;", dataBasePath); 
Verwandte Themen