SQLite:无法以编程方式打开网络文件,即使以前工作过

knsnq2tg  于 2023-06-23  发布在  SQLite
关注(0)|答案(5)|浏览(128)

我已经使用下面的代码打开了一个SQLite数据库文件,该文件在网络计算机上运行了一年多,现在几乎每天都在运行。今天早上,我突然无法以编程方式打开文件。

private Boolean Connect(String strPathFile)
{
    // Initialize the connection object.
    this.DbConnection = null;

    try
    {
        // DATABASE: Create the connection string and set the settings.
        String strConnection = @"Data Source=" + strPathFile + @";Version=3;";

        // DATABASE: Connect to the database.
        this.DbConnection = new SQLiteConnection(strConnection);
        this.DbConnection.Open();

        return true;
    }

    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }

    return false;
}

该文件是一个网络资源,格式为“\Server\ShareName\FileName.db”(减去双引号)。
有趣的是。SQLite Administrator在打开网络数据库文件时没有问题,没有,并且重复打开。我也可以在本地打开文件。我将文件复制到本地驱动器,并简单地更改了Visual Studio 2012(VS2012)中的路径。
服务器看起来很好。自从我上次检查它以来,它已经经历了一次重启。我想是微软的更新。文件资源管理器在浏览文件夹时没有问题,正如我所说,SQLite管理员可以打开网络文件。
我再次检查了权限,每个人都有完全的控制权,服务器的用户也有完全的控制权,包括安全权限和共享权限。我检查了文件夹和文件,权限是一样的。因为SQLite管理员可以打开该文件。服务器未设置防火墙、Windows防火墙或其他防火墙。今天早上我也重新检查过了。同样,SQLite管理员会抱怨这一点。
我通过使用文件资源管理器在网络驱动器上复制文件来验证写入。没有任何问题。
服务器是Windows Server 2003。我正在使用Windows 7 Professional 64位。
我还尝试以只读模式打开数据库,但也失败了。我就知道你会这样。SQLite Administrator仍然工作得很好。
我尝试了各种其他连接字符串,包括SQLiteConnectionStringBuilder(),只是为了看看会发生什么,所有的道路都通向罗马,即:

System.Data.SQLite.SQLiteException occurred
  HResult=-2147467259
  Message=unable to open database file
  Source=System.Data.SQLite
  ErrorCode=14
  StackTrace:
       at System.Data.SQLite.SQLite3.Open(String strFilename, SQLiteConnectionFlags connectionFlags, SQLiteOpenFlagsEnum openFlags, Int32 maxPoolSize, Boolean usePool)
       at System.Data.SQLite.SQLiteConnection.Open()
       at SQL.cSQL.Connect(String strPathFile) in C:\<Path to source file>:line 367
  InnerException:

有什么想法?

zz2j4svz

zz2j4svz1#

在版本> 1.0.82.0
1.将文件名中的前两个反斜杠加倍(例如"\\\\network\share\file.db")。
1.使用Map的驱动器号。
1.使用SQLiteConnection构造函数,该构造函数接受parseViaFramework布尔值参数,并为该参数传递'true'。
查看SQL post here

lymnna71

lymnna712#

假设db文件是可访问的(例如“因为SQLite管理员可以打开文件”),那么来自ranmoro和GEEF的答案中的选项#2似乎可以工作。这变成:

bool parseViaFramework = true;
con = new SQLiteConnection( cs, parseViaFramework );

基本原理在https://system.data.sqlite.org/index.html/info/bbdda6eae2中的SQLite签入评论“mistachkin added on 2013-05-25 21:06:45”中进行了讨论
我的连接字符串的格式为:

URI=file:\\SERVER\Data\SqlData\History.db

对于UNC路径,或

URI=file:C:\Data\SqlData\History.db

对于本地路径。
我正在使用:

Visual Studio 2022
<TargetFramework>net5.0-windows</TargetFramework>
<PackageReference Include="System.Data.SQLite.Core" Version="1.0.115.5" />
dy2hfwbg

dy2hfwbg3#

我也遇到过类似的问题。用Map的驱动器路径(S:\folder\file.db)替换UNC(\server\share\folder\file.db)解决了我的示例中的问题。

gg58donl

gg58donl4#

错误信息非常具有误导性+令人恼火。在本地环境中工作正常的应用程序在客户端服务器情况下无法启动。
主要与代码有关。这与服务器端有关。

  • 确保Write访问权限可用于包含该文件的服务器文件夹。
  • UNC [基于IP的服务器路径]仍然不受支持,应Map网络路径/文件夹以解决此问题。
  • 一些网站+用户说要提到版本号。在连接字符串中。我所有的应用程序都运行良好没有使用它。

连接字符串:

Data Source=[Mapped Server Location]\[SubFolders]\[FileName].db;

更新:
我尝试将\\前置到UNC路径,并且成功了(仅在开始时添加额外的\\,而不是在中间)。

Data Source=\\[UNC]\[SubFolders]\[FileName].db;
2o7dmzc5

2o7dmzc55#

对我来说,工作的解决方案是从反斜杠改为正斜杠。
代码环境是PowerShell。
Powershell示例:

# Failed with error: Exception calling "Open" with "0" argument(s): "unable to open database file"
$db = "Data Source=\\NetworkServer\folder\database.db" 

# Failed with error: Cannot find drive. A drive with the name 'X' does not exist. - Actually it's exists!!
$db = "Data Source=X:\folder\database.db"

# Failed with error: WARNING: Cannot find the database file
$db = "Data Source=\\\\NetworkServer\folder\database.db"

# Finally Solution! WORKED PERFECT !!!
$db = "Data Source=//NetworkServer/folder/database.db"
connection = New System.Data.SQLite.SQLiteConnection($db)
connection.Open() ' no exception

我花了很多时间,尝试了以上所有的解决方案,但只有这个对我有效。
来源:This Comment

相关问题