如何使用SQLitePCL执行sql文件的内容

时间:2017-08-19 17:22:46

标签: sqlite uwp

我正在尝试使用SQLitePCL包开发一个执行数据库命令的简单UWP应用程序(create-select-update-delete)。我创建了一个包含一些sqlite命令的数据库sql文件,我试图在我的代码中执行它们:

        Uri appUri = new Uri("ms-appx:///Assets/db.sql");
        StorageFile sFile = StorageFile.GetFileFromApplicationUriAsync(appUri).AsTask().ConfigureAwait(false).GetAwaiter().GetResult();
        string sSQL = FileIO.ReadTextAsync(sFile).AsTask().ConfigureAwait(false).GetAwaiter().GetResult();
        ISQLiteStatement cnStatement = dbConnection.Prepare(sSQL);
        cnStatement.Step();

但是当我运行程序时,它只执行sql文件中的第一个语句,即CREATE命令并退出而不执行其余命令。以下是sql文件的示例内容:

  CREATE TABLE Superhero (
  Type    TEXT PRIMARY KEY,
  Picture TEXT
  );

  INSERT INTO Superhero (
                     Type,
                     Picture
                 )
                 VALUES (
                     'batman',
                     'batman.ico'
                 );

任何人都知道SQLitePCL中是否有办法执行sql文件? 任何帮助将非常感谢! 谢谢!

1 个答案:

答案 0 :(得分:0)

根据sqlite3_prepare界面的描述:

  

这些例程只编译zSql中的第一个语句,因此* pzTail指向仍未编译的内容。

因此看起来只有命令中的第一个语句才真正执行。其余的被默默地忽略了。由于每个命令都以符号&#34 ;;"结束,为了快速简单的解决方案,您可以将sql命令拆分为单个语句,然后逐个执行。例如:

string sSQL = FileIO.ReadTextAsync(sFile).AsTask().ConfigureAwait(false).GetAwaiter().GetResult();
var dbConnection = new SQLiteConnection("sun.db", SQLiteOpen.READWRITE);
//using (ISQLiteStatement cnStatement = dbConnection.Prepare(sSQL))
//{
//    var result = cnStatement.Step();
//} 
var statements = sSQL.Split(new[] { ';' });
foreach (string onestate in statements)
{
    using (ISQLiteStatement cnStatement = dbConnection.Prepare(onestate))
    {
        var result = cnStatement.Step();
    }
}

否则,您可能需要更新SQLitePCL Nuget包。