2016-03-30 19 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);