Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sqlite c#创建两个同名数据库_C#_Wpf_Sqlite - Fatal编程技术网

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

Sqlite c#创建两个同名数据库,c#,wpf,sqlite,C#,Wpf,Sqlite,我有一个问题,当我想要创建数据库并指定其名称时,它是在指定的目录和应用程序运行的目录中创建的。为什么会这样 创建数据库的代码: private static string AddDb(string dbName, string dbPassword) { try { string startupPath = Environment.CurrentDirectory; string dataBasePa

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

创建数据库的代码:

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

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

问题似乎是您在
CreateFile
和连接字符串中使用了不同的路径

如果查看下面的代码,您会注意到,在一种情况下,您使用完整路径创建文件(
databasepath
),而在另一种情况下,您只在连接字符串中使用数据库文件名(
dbName
)。如果没有绝对路径,这可能是另一个文件夹

string dataBasePath = startupPath + "\\DB\\" + dbName;
SQLiteConnection.CreateFile(dataBasePath);
SQLiteConnection dbConnString;
dbConnString = new SQLiteConnection("Data Source =" + dbName + ";Version=3;");
似乎是
Open
然后在找不到文件时创建文件

路径上的一个词:

  • 不允许您编写
    程序文件
    文件夹,因此将当前文件夹用于数据库文件确实是个坏主意
  • 使用
    Environment.CurrentDirectory
    也是一个坏主意。根据您启动应用程序的方式,此文件夹可能是您认为的文件夹,也可能不是(请参阅我对其他答案和答案的评论)
  • 永远不要假设
    \
    实际上是路径分隔符。使用路径。合并路径
  • 我建议您使用获取所有用户共享的位置(如果数据库内容应该共享)或当前用户专用的位置(如果所有用户都应该有自己的数据库),并在那里创建数据库:

    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);
    
    string baseFolder=Environment.GetFolderPath();
    字符串dataBasePath=Path.Combine(baseFolder,“DB”,dbName);
    SQLiteConnection.CreateFile(数据库路径);
    SQLiteConnection dbConnString=新的SQLiteConnection(String.Format(“数据源={0};版本=3;”,数据库路径);
    
    同样错误。它并不总是包含应用程序启动的目录,而是当前的工作目录,这是非常不同的。请参见“是”,它确实包含。如果您创建一个简单的应用程序来打印它,它会输出应用程序启动的目录。他使用的是环境类而不是目录类。您还可以更改Environment.CurrentDirectory。至少在框架4.5.2和4.6.1中是这样。他可能在没有意识到的情况下更改了它吗?如果你创建了一个简单应用程序的快捷方式,并指定了一个不同的工作目录,那么它不会。文档中还谈到了工作目录。尽管如此,安装到程序文件中的应用程序无论如何都不允许lder在那里写入,因此OP应该使用正确的位置。似乎此调用正在exe目录dbConnString.Open()中创建sqlite文件;