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も正常に行われます。