我正在尝试使用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文件? 任何帮助将非常感谢! 谢谢!
答案 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包。