6

我正在尝试让 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 或其他东西,那将节省大量时间。我目前遇到的问题是,一旦我打开数据库并关闭它,我就无法重新打开它。

4

2 回答 2

5

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

== 其他评论 ==

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

我将尝试将我的更改部署到 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);
        }
    }

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

这是我第一次尝试调试并为开源项目做出贡献。对这些更改的任何评论或想法将不胜感激。

阿拉斯代尔。

于 2011-04-08T13:24:20.673 回答
3

嗨,我遇到了同样的问题......我想我已经解决了。这就是我所做的。

  public void CloseDB()
  {
    Connection.Close();               //Connection is a property(of type SqliteConnection) of my object
    FileStream.HandleTracker.Clear(); //This here is the fix
  } 

我真的不需要更改dll。
我还不确定这是否会在以后导致错误,但现在它对我有用。
...我只是一个初级程序员:D

于 2011-06-22T10:08:41.920 回答