0

パラメータ化されたクエリを実行できる System.Data.SQLite のラッパー メソッドを作成しました。

.Add() で SQLiteParameter[] をリストに追加しようとすると、リスト内のすべての項目が最後に追加された項目の複製になります。

コードは次のとおりです。

string sql = "INSERT INTO request_flow (request_id, sequence, date_assigned " +
            "VALUES (@request_id, @sequence, @date_assigned);";

List<SQLiteParameter[]> paramList = new List<SQLiteParameter[]>();

SQLiteParameter[] param = new SQLiteParameter[3];

SQLiteParameter p1 = new SQLiteParameter("request_id", DbType.Int32);
SQLiteParameter p2 = new SQLiteParameter("sequence", DbType.Double);
SQLiteParameter p3 = new SQLiteParameter("date_assigned", DbType.String);

for (int i = 0; i < assigneeIDs.Count; i++)
{
    p1.Value = requestID;
    p2.Value = Convert.ToDouble(last_seq + "." + (i + 1));
    p3.Value = DateTime.Now.ToString(ThisAddIn.FullDate);

    param[0] = p1;
    param[1] = p2;
    param[2] = p3;

    paramList.Add(param);
}

int inserted = SQLite.ExecuteParams(sql, paramList);

デバッグする各ループの後にベアクポイントを配置し、最初の反復後の値が意図したとおりであることを確認しました。ただし、次の反復では、最初の項目 (インデックス 0) が何らかの形で 2 番目の反復の値で上書きされます。そのため、最後に追加されたアイテムは、リスト内の以前のすべてのアイテムを常に上書きします。

私は何を間違えましたか?

編集:これは、同じ動作をする単純な (依存関係が少なくて済む) サンプル コードです。

List<string[]> paramList = new List<string[]>();

string[] param = new string[3];

string p1 = "";
string p2 = "";
string p3 = "";

for (int i = 0; i < 3; i++)
{
    p1 = i.ToString() + ".1";
    p2 = i.ToString() + ".2";
    p3 = i.ToString() + ".3";

    param[0] = p1;
    param[1] = p2;
    param[2] = p3;

    paramList.Add(param);
}

foreach (string[] s in paramList)
{
    this.textBox1.Text += String.Join(",", s) + "\r\n";
}
4

2 に答える 2

3

反復ごとに新しいパラメーター配列を作成したり、反復ごとに新しいパラメーターを作成したりするのではなく、同じものを何度も変更しているだけです。ループの反復ごとに新しい配列が作成され、ループの反復ごとに新しいパラメーターが作成されるようにする必要があります。この場合、これらの変数をループの外で定義するべきではありません。ループ内でそれらを定義します。

for (int i = 0; i < assigneeIDs.Count; i++)
{
    SQLiteParameter[] param = new SQLiteParameter[3];

    SQLiteParameter p1 = new SQLiteParameter("request_id", DbType.Int32);
    SQLiteParameter p2 = new SQLiteParameter("sequence", DbType.Double);
    SQLiteParameter p3 = new SQLiteParameter("date_assigned", DbType.String);

    p1.Value = requestID;
    p2.Value = Convert.ToDouble(last_seq + "." + (i + 1));
    p3.Value = DateTime.Now.ToString(ThisAddIn.FullDate);

    param[0] = p1;
    param[1] = p2;
    param[2] = p3;

    paramList.Add(param);
}
于 2013-04-22T20:48:33.380 に答える
0

「param」の同じインスタンスで作業しているために発生すると思います。ループ内でインスタンス化してみてください。

于 2013-04-22T20:51:05.360 に答える