我正在尝试对SQLiteCommand
3 个单独的表执行包含 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 行,它也可以工作。所以我猜我一定是参数做错了。但我真的看不出这段代码有什么问题。谁能帮我这个?