List. add()创建c#的副本

本文关键字:创建 副本 add List | 更新日期: 2023-09-27 18:10:19

我已经围绕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);

我确实在每个循环后放置了一个bearkpoint以进行调试,并且我确认第一次迭代后的值是预期的。但是,在下一次迭代中,第一个项(索引0处)以某种方式被第二次迭代的值覆盖。所以最后添加的项总是会覆盖列表中前面的每一个项。

我做错了什么?

EDIT:下面是一个更简单(需要较少依赖)的示例代码,具有相同的行为:

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";
}

List<T[]>. add()创建c#的副本

您不是在每次迭代中创建新的参数数组,也不是在每次迭代中创建新的参数,您只是在一次又一次地改变相同的参数。您需要确保每次循环迭代都创建一个新的数组,并为每次循环迭代创建新的参数。在这种情况下,你不应该在循环之外定义这些变量;在循环内定义它们:

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);
}

我认为这是因为你在同一个实例上工作的"param"。尝试在循环中实例化它。