Sqlite c#创建了两个相同的命名数据库

时间:2016-03-30 15:37:36

标签: c# wpf sqlite

我遇到一个问题,当我想创建数据库并指定其名称时,它会在指定的目录和运行aplication的目录中创建。为什么会这样?

创建数据库的代码:

    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 "";
        }
    }

2 个答案:

答案 0 :(得分: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
  4. 我建议您使用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);
    

答案 1 :(得分:-1)

Environment.CurrentDirectory包含应用程序默认启动的目录。您可以设置此属性。请参阅MSDN文章Environment.CurrentDirectory Property