6

Community.Csharp を Windows Phone で動作させようとしています。http: //wp7sqlite.codeplex.com/ の両方のバージョンを使用して、メイン トランクを WINDOWS_PHONE フラグでコンパイルしようとしましたが、アプリケーションを実行すると電話でクエリを実行しようとするとエラーが発生します(ただし、データベースを開くときではなく、クエリのみ):「データベースファイルを開くことができません」

_conn = new SqliteConnection("Version=3,uri=file:recipes.sqlite");
_conn.Open();
cmd.CommandText = "SELECT * FROM recipes";
SqliteDataReader reader = cmd.ExecuteReader();

興味深いことに、次を使用してテーブルの存在を確認していますが、例外はスローされません。

cmd.CommandText = "SELECT * FROM sqlite_master WHERE name='" + tableName + "'";
SqliteDataReader rdr = cmd.ExecuteReader();
exists = rdr.Read();
rdr.Close();

私は SQLite を使用する Windows アプリを持っているので、Sterling DB などではなく SQLite を使用できれば、時間を大幅に節約できます。私が現在抱えている問題は、データベースを開いて閉じると、再度開くことができないことです。

4

2 に答える 2

5

私は当社のアプリケーションに同じライブラリを使用しており、私が知る限り、http://wp7sqlite.codeplex.com(いくつかの推奨事項の下)にも記載されています。接続を閉じると、再度作成する必要があります。

==追加のコメント==

エラーの原因を突き止め、修正を作成し、アプリケーションでテストしています。簡単に説明すると、Community.CSharpSqliteライブラリをWP7に移植するために、作成者はWP7IsolatedStorageFileStreamの周りにFileStreamラッパーを作成しました。dbを開くと、dbファイルストリームがCSharpSqliteによって開かれ、読み取られて閉じられます。ただし、このストリームへのハンドルは、ファイルパスをストリームにマッピングするディクショナリにも格納されます。dbをもう一度開くと、ストリームへのハンドルが取得されますが、閉じられているため(私は、まだ検証していないと思います)、dbを開くことができません。

変更をwp7sqlite.codeplex.comプロジェクトにデプロイしようとしますが、それまでの間、ソースコードがある場合は、 Community.CsharpSqlite.FileStreamに次の変更を加えてください。

から変更する

    public FileStream(string path, FileMode mode, FileAccess access, FileShare share, int unused)
    {
        IsolatedStorageFileStream handler = null;
        if (FileStream.HandleTracker.TryGetValue(path, out handler))
        {
            _internal = handler;
        }
        else
        {
            if (mode == FileMode.Create || mode == FileMode.CreateNew)
            {
                _internal = IsolatedStorageIO.Default.CreateFile(path);
            }
            else
            {
                _internal = IsolatedStorageIO.Default.OpenFile(path, FileMode.OpenOrCreate);
            }
            FileStream.HandleTracker.Add(path, _internal);
        }
    }

    public FileStream(string path, FileMode mode, FileAccess access, FileShare share, int unused)
    {
        IsolatedStorageFileStream handler = null;
        if(FileStream.HandleTracker.TryGetValue(path, out handler)) 
        {
            _internal = handler;
            if(!_internal.CanRead) 
            {
                FileStream.HandleTracker.Remove(path);
                CreateOpenNewFile(path, mode);
            }
        } else {
            CreateOpenNewFile(path, mode);
        }
    }

    private void CreateOpenNewFile(string path, FileMode mode) 
    {
        if(mode == FileMode.Create || mode == FileMode.CreateNew) 
        {
            _internal = IsolatedStorageIO.Default.CreateFile(path);
        } else {
            try {
                _internal = IsolatedStorageIO.Default.OpenFile(path, FileMode.OpenOrCreate);
            } catch(Exception ex) {
                var v = ex;
            }
        }
        FileStream.HandleTracker.Add(path, _internal);
    }

デバッグしてオープンソースプロジェクトに貢献しようとするのはこれが初めてです。これらの変更についてのコメントや考えは大歓迎です。

アラスデア。

于 2011-04-08T13:24:20.673 に答える
3

こんにちは私は同じ問題に遭遇しました...私はそれの修正を得たと思います。これは私がやったことです。

  public void CloseDB()
  {
    Connection.Close();               //Connection is a property(of type SqliteConnection) of my object
    FileStream.HandleTracker.Clear(); //This here is the fix
  } 

dllを変更する必要はありません。
これが後でエラーを引き起こすかどうかはまだわかりませんが、今のところはうまくいきます。
...私はジュニアプログラマーです:D

于 2011-06-22T10:08:41.920 に答える