3

SQLiteConnection 文字列の最も基本的な形式は、"data source = ..." です。

MyData.sdb という名前の SQLite データベース ファイルがあるデモを試してみました。このファイルはデモ プロジェクトのフォルダー ツリー (例: DemoProject\MyData.sdb) に配置されていました。そして、次の SQLiteConnection 文字列が機能しました。

"data source = MyData.sdb"

テーブルを選択できました。デモ プロジェクト フォルダー (DemoProject\Data\MyData.sdb など) の別の子フォルダーに MyData.sdb を追加しようとしても、上記の接続文字列は機能しますか? うわー、信じられない。しかし、今最も奇妙なことです(デモプロジェクトで経験したこととは対照的です):

別のプロジェクトを試して同じものを適用すると、SQLite データベースに存在するテーブルを選択しようとすると、「そのようなテーブルはありません...」という例外がスローされました。とても奇妙です。データベースファイルへのパスが間違っているのではないかと疑っています。そして、次のようにデータベースファイルの絶対パスを使用してみました:

"data source = D:\\demo project\\MyData.sdb"

その後、うまくいきました。デモ プロジェクトで SQLite データベース ファイルに相対パスを使用したのに、新しいプロジェクトでは適用できないのはなぜですか?

簡単ではないと思います。説明するにはあなたの経験が必要です。奇妙なことは、デモプロジェクトまたは私の新しいプロジェクトにある可能性があり、異常に機能したプロジェクトがあるはずです。

助けてください!ありがとうございました!

4

2 に答える 2

1

アプリの現在の作業ディレクトリが何であるかが原因で、プロジェクト間でデータベース ファイルへの相対パスが機能しない場合があります。アプリの実行中に取得することで、アプリの作業ディレクトリを確認できますEnvironment.CurrentDirectory

たとえば、C# コンソール アプリでは、作業ディレクトリは次のようになります。

D:\Projects\SQLiteTest\bin\Debug

データ ソースが である場合"data source = MyData.sdb"、コンソール アプリは でそのデータベースを探しますD:\Projects\SQLiteTest\bin\Debug\MyData.sdb

次のアプリが IIS で実行されている asp.net アプリである場合、作業ディレクトリは次のようになります。

C:\windows\system32\inetsrv

データベースを ではなくプロジェクト フォルダーに配置する可能性が高いため、アプリはデータベースの場所を見つけることができませんC:\windows\system32\inetsrv\MyData.sdb

この SO の質問には、データベースへの相対パスを一貫して解決するためのいくつかの解決策が含まれています。

于 2017-07-29T00:01:58.730 に答える