0

我正在尝试对SQLiteCommand3 个单独的表执行包含 3 个插入的操作。在所有 3 个表中,主键被调用offset。在第三条语句中,我想插入两行。

该命令共有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 行,它也可以工作。所以我猜我一定是参数做错了。但我真的看不出这段代码有什么问题。谁能帮我这个?

4

1 回答 1

0

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

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

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

insert into page(offset) values (?1);
insert into block(offset, length, originaloffset, page) values (?2, ?3, ?4, ?5);
...
于 2013-01-28T15:29:40.217 回答