SQLitePCL选择调用 - ISQLiteStatement.Step检索条件

时间:2016-11-26 17:20:54

标签: c# sql .net sqlite uwp

我正在使用SQLitePCL制作UWP应用

我有一张名为" Song"

的表格
CREATE TABLE IF NOT EXISTS Song
                (ID INTEGER Primary Key AutoIncrement NOT NULL
                , Artist VARCHAR(200)
                , Title VARCHAR(200)
                , Album VARCHAR(200)
                , Path VARCHAR(255)
                , Type VARCHAR(50));

检索功能:

private static async Task<Song> getSong(int sID)
    {
        //TODO IMPLIMENT TYPE CHECK
        Song newsong = null;
        using (var statement = dbConnection.Prepare(@"SELECT [ID],[Path] FROM Song WHERE ID = ?"))
        {
            statement.Bind(1, sID);
            if(SQLiteResult.DONE == statement.Step())
            {
                string path = (string)statement[1];
                StorageFolder folder = KnownFolders.MusicLibrary;
                StorageFile songfile = await folder.GetFileAsync(path);
                MusicProperties prop = await songfile.Properties.GetMusicPropertiesAsync();
                newsong = new Song()
                {
                    Id = (int)statement[0],
                    SongFile = songfile,
                    Artist = prop.Artist,
                    Album = prop.Album,
                    Title = prop.Title
                };

            }
        }
        return newsong;
    }

问题是,似乎忽略了我设定的条件:

if(SQLiteResult.DONE == statement.Step()

这是一种错误的条件吗?我只想在遇到匹配ID的行后检索值。

1 个答案:

答案 0 :(得分:3)

结果代码SQLiteResult.DONE表示sqlite3_step()已完成执行。在您的代码段中,如果您的数据表仍有需要阅读的行,statement.Step()将返回SQLiteResult.ROW结果代码,这意味着sqlite3_step()有另一行准备好阅读,但未完成。

所以条件应该是

while (statement.Step() == SQLiteResult.ROW)

有关结果代码的更多详情,请参阅this article