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);
    }

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

阿拉斯代尔.

相关文章

原文地址:http://msdn.microsoft.com/en-us/magazine/cc163...
前言 随着近些年微服务的流行,有越来越多的开发者和团队所采...
最近因为比较忙,好久没有写博客了,这篇主要给大家分享一下...
在多核CPU在今天和不久的将来,计算机将拥有更多的内核,Mic...
c语言输入成绩怎么判断等级
字符型数据在内存中的存储形式是什么