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

vngu2lb8  于 2022-11-15  发布在  SQLite
关注(0)|答案(2)|浏览(224)

我有一个问题,当我想要创建数据库并指定其名称时,它是在指定的目录和运行应用程序的目录中创建的。为什么会发生这种情况?
创建数据库的代码:

using System.Data.SQLite;
...

private static string AddDb(string dbName, string dbPassword)
{
    try
    {
        //default paths
        string startupPath = Environment.CurrentDirectory;
        string dataBasePath = startupPath + "\\DB\\" + dbName;
        
        //creating the dbfile
        SQLiteConnection.CreateFile(dataBasePath);
        
        //Opening connection
        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 "";
    }
}
7nbnzgx9

7nbnzgx91#

问题似乎是您在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文件夹,因此使用当前文件夹作为数据库文件确实不是一个好主意。
1.使用Environment.CurrentDirectory也不是一个好主意。根据您启动应用程序的方式,这可能是您认为的文件夹,也可能不是(请参阅我对其他答案和this的评论)。
1.切勿假设\实际上是路径分隔符。请改用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);
yhived7q

yhived7q2#

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

相关问题