我遇到一个问题,当我想创建数据库并指定其名称时,它会在指定的目录和运行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 "";
}
}
答案 0 :(得分:1)
问题似乎是您在CreateFile
和连接字符串中使用了不同的路径。
如果您查看下面的代码,您会注意到在一种情况下您使用完整路径来创建文件(databaseBasePath
),而在另一种情况下,您只使用数据库文件名您的连接字符串(dbName
)。没有绝对路径,这可能是一个不同的文件夹!
string dataBasePath = startupPath + "\\DB\\" + dbName;
SQLiteConnection.CreateFile(dataBasePath);
SQLiteConnection dbConnString;
dbConnString = new SQLiteConnection("Data Source =" + dbName + ";Version=3;");
似乎Open
会创建文件,如果它无法找到它。
路径上的一句话:
Program Files
文件夹,因此使用数据库文件的当前文件夹确实是一个坏主意。Environment.CurrentDirectory
也是一个坏主意。根据您启动应用程序的方式,这可能是您认为的文件夹,也可能不是(请参阅我对其他答案的评论和this)。\
实际上是路径分隔符。请改用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);
答案 1 :(得分:-1)
Environment.CurrentDirectory包含应用程序默认启动的目录。您可以设置此属性。请参阅MSDN文章Environment.CurrentDirectory Property