我在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处)以某种方式被第二次迭代的值覆盖。因此,最后添加的项目将始终覆盖列表中的每个前一项。
我做错了什么?
编辑:以下是一个更简单(需要更少依赖)的示例代码,它具有相同的行为:
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";
}
答案 0 :(得分: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);
}
答案 1 :(得分:0)
我认为那是因为你正在处理“param”的同一个实例。 尝试在循环中实例化它。