UNCパス上にあるSQLiteファイル

Sponsored Link

UNCパスとは

所謂「共有ネットワークパス」

「ローカルPC上のパス」や「ネットワークドライブの割り当てでのパス」の場合、「C:¥」「D:¥」という形式になるかと思いますが、「共有ネットワークパス」の場合「\\servername\sharedrive」といった形式のものとなります。

Sponsored Link

共有ネットワークパス上にあるSQLiteファイルが読み込めない?

「sqlite unc path」などで検索すると事例がいくつも上がっていますが、想定した書き方だと接続時にエラーとなります。

こちら、DB接続用の関数をサンプルとして作成しました。引数にはDBファイルパスを渡します。

System.Data.Common.DbConnection GetOpenConn(string filepath)
{
    System.Data.Common.DbConnection conn = null;
    try
    {
        var scsb = new SQLiteConnectionStringBuilder();

        // DataSource=ファイルパス
        scsb.DataSource = filepath;

        conn = System.Data.Common.DbProviderFactories.GetFactory("System.Data.SQLite").CreateConnection();
        conn.ConnectionString = scsb.ToString();
        conn.Open();
    }
    catch
    {
        throw;
    }

    return conn;
}

例として「c:\work\db\test.db」を引数に渡した場合には問題ありません。

が、仮に共有ディレクトリ上に「test.db」が存在していると仮定して「\\ShareServer\Work\db\test.db」を引数として渡した場合には・・・

conn.Open(); でエラーとなります。

エラーメッセージとしては

unable to open database file

DBファイルが開けないとのことです。

Sponsored Link

解決方法として

UNCパスの場合、先頭の「\\」を「\\\」と3文字にする必要があるようです。

なのでDataSourceにセットする箇所を以下のように変更

var scsb = new SQLiteConnectionStringBuilder();

// DataSource=ファイルパス
Uri u = new Uri(filepath);
if (u.IsUnc)
    // UNCパス
    scsb.DataSource = @"\" + u.LocalPath;
else
    // ローカルPC上のパス
    scsb.DataSource = filepath;

ローカルPC上のパスであればそのまま、

UNCパス上であれば先頭に「\」を1文字付与する形で対応。

これでOpenも正常に行われます。

タイトルとURLをコピーしました