SQLiteCommand
3 つの個別のテーブルへの 3 つの挿入を含むを実行しようとしています。3 つのテーブルすべてで、主キーは と呼ばれoffset
ます。3 番目のステートメントでは、2 つの行を挿入します。
コマンドには全部で 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 である (つまり、同じではない) ことです。このコマンドを実行すると、主キーが一意である必要があることを示す例外がスローされます。
奇妙なのは、チャンク テーブルに 1 行だけ挿入すると機能することです。奇妙なのは、チャンク テーブルの挿入を別の で実行すると、SQLiteCommand
2 行を同時に挿入しても機能することです。だから私はパラメータに何か間違ったことをしたに違いないと推測しています。しかし、このコードに問題があることは本当にわかりません。誰でもこれで私を助けることができますか?