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或其他东西,那将节省大量时间.我现在遇到的问题是,一旦我打开数据库并关闭它,我就无法重新打开它.
我在我们公司的应用程序中使用相同的库,据我所知,也在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)
这是我第一次尝试调试并为开源项目做出贡献.任何关于这些变化的评论或想法将不胜感激.
阿拉斯代尔.