我试图让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); }
这是我第一次尝试调试并为开源项目做出贡献.任何关于这些变化的评论或想法将不胜感激.
阿拉斯代尔.