c# – Windows Phone 7:SQLite

前端之家收集整理的这篇文章主要介绍了c# – Windows Phone 7:SQLite前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图让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应用程序,所以如果我可以使用sqlite而不是Sterling DB或其他东西,那将节省大量时间.我现在遇到的问题是,一旦我打开数据库关闭它,我就无法重新打开它.

解决方法

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

==其他评论==

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

我将尝试将我的更改部署到wp7sqlite.codeplex.com项目,但在此期间如果您有source code,则对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,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);
    }

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

阿拉斯代尔.

猜你在找的C#相关文章