2

データベースにアクセスする C# プログラムを作成していますが、ネットワーク内の他のユーザーもデータベースにアクセスしています。SQLite データベースです。ここで、誰かが単に SQLite データベースに書き込みを行った場合、SQLite データベースを調べることができるかどうかを尋ねたいと思いますか?

私のプログラムが SQLite DB に書き込もうとする可能性があると思っていましたが、他の誰かがその DB に書き込んだ場合、「アクセスが拒否されました」という警告が表示されます。

しかし、これを C# で実装するにはどうすればよいでしょうか?

下手な英語でごめんなさい

4

2 に答える 2

2

別のデータベースが必要です。SQLite は同時書き込み接続を処理できません。同時読み取りのみ。

SQLite は、ローカル/クライアント ストレージの組み込みデータベースとして適していますが、異なるスレッド/PC からの接続が必要な場合は、Sql Server Expressなどの別のソリューションが必要です。

SQLite を使用する必要がある場合は、書き込み時に Access Denied Exception をキャッチし、構成可能なタイムアウトが期限切れになるまで自動的に取得するメカニズムを設定する必要があります。

SQLiteのドキュメントに記載されているように

SQLite が別のプロセスによってロックされているファイルにアクセスしようとすると、デフォルトの動作は SQLITE_BUSY を返すことです。

SQLITE_BUSY をテストします。ソリューションを説明するための疑似コードを次に示します。

while (continueTrying) {
   retval = sqlite_exec(db, sqlQuery, callback, 0, &msg);
switch (retval) {
  case SQLITE_BUSY:
    Log("[%s] SQLITE_BUSY: sleeping fow a while...", threadName);
    sleep a bit... (use something like sleep(), for example)
    break;
  case SQLITE_OK:
    continueTrying = NO; // We're done
    break;
  default:
    Log("[%s] Can't execute \"%s\": %s\n", threadName, sqlQuery, msg);
    continueTrying = NO;
    break;
}
}
return retval;

SQLite マルチスレッド リファレンス

于 2013-02-21T08:54:14.387 に答える
0

SQLite はファイルベースであるため、同時に複数の接続をサポートしていません。

できることは、ファイルのロックを取得しようとすることです。それが失敗した場合は、他の誰かがそれを使用していることがわかるので、ユーザーにメッセージを表示するか、数秒間一時停止して試行する再試行メカニズムを実装できます。再びなど。

要するに、Sqlite db ファイルを同時に使用することはできません。

于 2013-02-21T09:00:58.907 に答える