通过网络连接SQLite数据库

5

我目前正在映射网络驱动器并连接到文件(Z:\ Data \ Database.db)。 我希望能够只使用相对路径(\ server \ Data \ Database.db)在连接字符串中,但它给我一个SQLite错误“无法打开数据库文件”。 Directory.Exists(\\ server \ Data \ Database.db); 检查返回true。

这是尝试使用路径“\ server”作为参数打开连接的方法:

public static OpenDB(string dbPath)
{
    using (SQLiteConnection conn = new SQLiteConnection($"Data Source={Path.Combine(dbPath, "Data\\Database.db")}"))
    {
        if (dbPath != null && dbPath != "")
        {
            try
            {
                conn.Open();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Unable to Open Database", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
    }
}

驱动器需要共享,网络凭据必须允许用户读取文件。 - jdweng
该文件夹及其文件本身已设置为所有用户具有完全读写权限。根文件夹(“Data”)是一个网络共享驱动器。 - B Minster
1
你能否使用Windows资源管理器以相同的路径打开文件夹?这将验证两台机器之间的凭据是否有效。如果用户帐户在两台计算机上无效,则无论文件是否被读取都没有意义。必须有一个组帐户来允许两台计算机具有相同的凭据。 - jdweng
3
请注意,由于可能会出现损坏问题,不建议将SQLite数据库托管在网络驱动器上。 - Shawn
@jdweng 这个方法非常有效。我使用了管理共享和在本地机器上制作数据库文件的临时副本的组合,以避免Shawn提到的问题。请将您的评论写成答案,这样我就可以给您信用! - B Minster
显示剩余2条评论
1个回答

3
这是我使用的解决方案。它是来自jdwengShawn的建议的组合。首先,我将路径dbPath设置为管理员共享驱动器。然后,我让程序从管理员共享中制作数据库的临时本地副本:
private static void MakeTempDatabaseCopy(string dbPath, string exePath)
{
    try
    {
        File.Copy(Path.Combine(dbPath, "Data", "Database.db"), Path.Combine(exePath, "Temp", "Database.db"), true);
        FileInfo directoryInfo = new FileInfo(Path.Combine(exePath, "Temp", "Database.db"));
        directoryInfo.Attributes = FileAttributes.Temporary;
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message, "Error Retrieving Database", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
}

此后所有的方法都可以从本地副本中读取。由于 File.Copy() 使用布尔值,任何需要刷新数据库的内容都可以使用最新的管理共享副本覆盖本地副本。希望这能帮到你!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接