【问题标题】:List<T[]>.Add() creates duplicates c#List<T[]>.Add() 创建重复 c#
【发布时间】:2013-04-22 20:44:31
【问题描述】:

我围绕 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 处)以某种方式被第二次迭代的值覆盖。所以最后添加的项目总是会覆盖列表中的每一个之前的项目。

我做错了什么?

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

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

【问题讨论】:

    标签: c# .net list ado.net


    【解决方案1】:

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

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

    【讨论】:

    • 啊哈!谢谢,那行得通。我已经习惯了 PHP,如果我用上面的代码就可以摆脱它。
    【解决方案2】:

    我认为这是因为您正在处理“param”的同一个实例。 尝试在循环中实例化它。

    【讨论】:

      猜你喜欢
      • 2015-04-30
      • 1970-01-01
      • 1970-01-01
      • 2021-11-12
      • 1970-01-01
      • 1970-01-01
      • 2013-03-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多