SQLite c# parameters

本文关键字:parameters SQLite | 更新日期: 2023-09-27 17:56:25

我正在尝试执行一个包含 3 个插入到 3 个单独表中的SQLiteCommand。在所有 3 个表中,主键称为 offset 。在第 3 条语句中,我想插入两行。

该命令共有 11 个参数

这是我之前用来初始化命令的代码(我想重用该命令,但即使在第一次使用此语句时也会出现此特定问题):

_insertBlockInNewPage = new SQLiteCommand("insert into page(offset) values (?); insert into block(offset, length, originaloffset, page) values (?, ?, ?, ?); insert into chunk(offset, length, page, free) values (?, ?, ?, 0), (?, ?, ?, 1)", _db);
for (var i = 0; i < 11; i++) _insertBlockInNewPage.Parameters.Add(new SQLiteParameter(DbType.Int64));
_insertBlockInNewPage.Prepare();

这是将使用此命令的方法:

public void InsertBlockInNewPage(long offset, long length, long originalOffset, long pageLength)
{
    _insertBlockInNewPage.Parameters[0].Value = offset;
    _insertBlockInNewPage.Parameters[1].Value = offset;
    _insertBlockInNewPage.Parameters[2].Value = length;
    _insertBlockInNewPage.Parameters[3].Value = originalOffset;
    _insertBlockInNewPage.Parameters[4].Value = offset;
    _insertBlockInNewPage.Parameters[5].Value = offset;
    _insertBlockInNewPage.Parameters[6].Value = length;
    _insertBlockInNewPage.Parameters[7].Value = offset;
    _insertBlockInNewPage.Parameters[8].Value = offset + length;
    _insertBlockInNewPage.Parameters[9].Value = pageLength - length;
    _insertBlockInNewPage.Parameters[10].Value = offset;
    _insertBlockInNewPage.ExecuteNonQuery();
}

这里重要的是参数 5 的值为 0,参数 8 的值为 131072(即不同)。当我执行此命令时,它会抛出一个异常,告诉我主键必须是唯一的。

奇怪的是,如果我只在块表中插入一行,它就可以工作。更奇怪的是,如果我在单独的SQLiteCommand中执行块表的插入,但仍然同时插入 2 行,它也可以工作。所以我猜我一定是参数做错了什么。但我真的看不出这段代码有什么问题。谁能帮我解决这个问题?

SQLite c# parameters

在 SQLite 中,参数索引从 SQL 语句的开头开始计数。

这意味着不可能在一个SQLCommand中将未命名的参数与多个SQL命令一起使用。

您可以尝试使用编号参数:

insert into page(offset) values (?1);
insert into block(offset, length, originaloffset, page) values (?2, ?3, ?4, ?5);
...