Windows Phone 7:SQLite

Ech*_*lon 6 c# sqlite windows-phone-7 windows-phone

我正在尝试让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();
Run Code Online (Sandbox Code Playgroud)

有趣的是,我使用以下内容来检查是否存在表,并且不会抛出任何异常:

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

我有一个使用SQLite的Windows应用程序,所以如果我可以使用SQLite而不是Sterling DB或其他东西,那将节省大量时间.我现在遇到的问题是,一旦我打开数据库并关闭它,我就无法重新打开它.

ajm*_*all 5

我在我们公司的应用程序中使用相同的库,据我所知,也在http://wp7sqlite.codeplex.com(在某些建议下)记录,如果你关闭连接,你需要再次重新创建它.

==其他评论==

我已经找到了错误的原因,创建了一个修复程序并在我们的应用程序中测试它.简而言之,为了将Community.CSharpSqlite库移植到WP7,作者在WP7 IsolatedStorageFileStream周围编写了一个FileStream包装器.打开db时,将打开db文件流,并由CSharpSqlite读取和关闭.但是此流的句柄也存储在将文件路径映射到流的Dictionary中.当数据库第二次打开时,将检索流的句柄,但由于它已关闭(我假设,尚未验证),因此无法打开数据库.

我将尝试将我的更改部署到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);
        }
    }
Run Code Online (Sandbox Code Playgroud)

    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);
    }
Run Code Online (Sandbox Code Playgroud)

这是我第一次尝试调试并为开源项目做出贡献.任何关于这些变化的评论或想法将不胜感激.

阿拉斯代尔.