2

現在、コンソール アプリケーションにこの SQLite ライブラリを使用しています: http://system.data.sqlite.org/index.html/doc/trunk/www/index.wiki - これまでのところ SELECT クエリでは問題ありませんが、このINSERTを実行すると、解決策が見つからない問題が発生します。

コードを作り直すことができると思いますが、方法がわかりませんか?

コード

public string NewChannel(string _channel)
{
    SQLiteConnection m_dbConnection = new SQLiteConnection(m_connection);
    using (var cmd = m_dbConnection.CreateCommand())
    {
        m_dbConnection.Open();
        cmd.CommandText = "INSERT INTO channels (name) VALUES (@name)";
        cmd.Parameters.AddWithValue("@name", _channel);

        try
        {
            int result = cmd.ExecuteNonQuery();
            return "New channel added: " + _channel;
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.InnerException);
            return null;
        }
    }
}

エラー

SQLite エラー (10): ロック/共有の競合のために 1375 ミリ秒遅延

エラー (14): os_win.c:34909: (5) winOpen(c:\db.sqlite-journal) - アクセスが拒否されました。SQLite エラー (14): os_win.c:34909: (2)

winOpen(c:\db.sqlite-journal) - システムがファイルを見つけられません

指定。SQLite エラー (14): 行 34917 でファイルを開けません

[118a3b3569] SQLite エラー (14): ステートメントは 7 で中止されます: [INSERT INTO channels (name) VALUES (@name)]

4

1 に答える 1

0

特定のエラー コードは、次のことを表します。

エラー コード 14: SQL Lite データベース ファイルを開けません。

管理者として Visual Studio を実行することが機能した理由は、 Read および Write のアクセス許可を昇格したためです。実際に新しいファイルを作成しているわけではありませんが、ファイルへのデータの読み取りまたは書き込みである可能性があります。

パーミッションが明示的に定義されていない限り、特定のロールに基づいて制限される特定のパーミッションに基づいています。

上で述べたように、ルートにデータを書き込むには、ルートにパワー ユーザー以上C:が必要です。データベースが追加しようとすると、書き込みができない可能性があると見なされます。

  1. 解決策 1: 問題を回避するために、アプリケーション/ユーザーのアクセス許可を明示的に定義します。
  2. 解決策 2: データ ファイルへのアクセスを試行する前にチェックを作成して、適切なアクセス許可を確保します。

このようなチェックの例:

public ValidFolderPermission(string filePath)
{
     if(File.Exist(filePath))
     {
          // Open Stream and Read.
          using (FileStream fs = File.Open(filePath, FileMode.Open))
          {
                byte[] data = new byte[1024];
                UTF8Encoding temp = new UTF8Encoding(true);

                while (fs.Read(b, 0, b.Length) > 0)
                {
                      Console.WriteLine(temp.GetString(b));
                }
           }
     }
}

この場合、実際にそのパスでファイルを開く場合は、適切なアクセス権があります。そうでない場合は、許可がありません。

重要: 実際にテストするには、tryandを使用しcatchboolean returns、データベースに書き込む前に正確に処理されたことを確認する必要があります。

次のように、ユーザーのアクセス許可レベルを確認することもできます。

WindowsIdentity user = WindowsIdentity.GetCurrent();
WindowsPrincipal role = new WindowsPrincipal(user);

if(role.IsInRole(WindowsBuiltInRole.Administrator)
{
     // Do Something
}
else
{
     // Do Something Else
}

これは一般的なアプローチですが、オペレーティング システムのユーザー アクセス制御機能、ユーザー アカウントの null 値など、遭遇する可能性のある他の問題の処理をテストする、より簡潔な方法があります。

うまくいけば、これはあなたを適切な方向に向けます。

于 2013-06-12T23:09:40.370 に答える