2016-03-30 42 views
0

我有一個問題,當我想創建數據庫並指定它的名稱時,它是在指定的目錄和應用程序正在運行的目錄中創建的。爲什麼會發生?創建數據庫Sqlite c#創建2個相同的命名數據庫

代碼:

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

看來這個調用是在exe目錄下創建一個sqlite文件 dbConnString.Open(); – phoenix

回答

-1

的Environment.CurrentDirectory包含應用程序的默認啓動的目錄。你可以設置這個屬性。請參閱MSDN文章Environment.CurrentDirectory Property

+0

錯了。它並不總是包含應用程序從其開始的目錄,而是包含當前的工作目錄,這是非常不同的。請參閱http://stackoverflow.com/questions/15653921/get-current-folder-path –

+0

是的。如果您創建一個簡單的應用程序將其打印出來,它會輸出應用程序啓動的目錄。他使用的是Environment類而不是Directory類。您也可以更改Environment.CurrentDirectory。至少它與框架4.5.2和4.6.1一樣。他沒有意識到他能改變它嗎? – Wrongway

+0

如果您爲簡單應用創建快捷方式並指定其他工作目錄,則不會。該文檔還討論了* working *目錄。無論如何,安裝到Program Files文件夾的應用程序無論如何都不允許寫入,所以OP應該使用適當的位置。 –

1

問題似乎是您在CreateFile和您的連接字符串中使用了不同的路徑。

如果你看看你的代碼,你會注意到在一種情況下你使用完整的路徑來創建文件(databaseBasePath),而在另一種情況下,你只能在連接字符串中使用數據庫文件名(dbName )。沒有絕對路徑,這可能是一個不同的文件夾!

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

看起來好像Open然後創建文件,如果它找不到它。

一個字的路徑:

  1. 不允許你寫Program Files文件夾,因此使用數據庫文件在當前文件夾確實是一個壞主意。
  2. 使用Environment.CurrentDirectory也是一個壞主意。取決於你如何開始你的應用程序,這可能是也可能不是你認爲它的文件夾(請參閱我對其他答案的評論和this)。
  3. 永遠不要認爲\實際上是路徑分隔符。改爲使用Path.Combine

我建議你使用Environment.GetFolderPath得到這一切用戶之間共享(如果數據庫的內容應該被共享)或私人以當前用戶(如果所有用戶都應該有自己的數據庫中)的位置和創建數據庫有:

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);