0

SQLiteCommand3 つの個別のテーブルへの 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 行だけ挿入すると機能することです。奇妙なのは、チャンク テーブルの挿入を別の で実行すると、SQLiteCommand2 行を同時に挿入しても機能することです。だから私はパラメータに何か間違ったことをしたに違いないと推測しています。しかし、このコードに問題があることは本当にわかりません。誰でもこれで私を助けることができますか?

4

1 に答える 1

0

SQLite では、パラメーター インデックスは SQL ステートメントの開始からカウントされます。

これは、名前のないパラメータを複数の SQL コマンドと一緒に 1 つの で使用できないことを意味します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 に答える