【问题标题】:Insert into SQL database, in foreach with checkbox list插入 SQL 数据库,在 foreach 中带有复选框列表
【发布时间】:2016-02-11 12:43:33
【问题描述】:

我有这个,并在另一个使 int id 变量的插入上创建了一个范围标识

foreach (ListItem item in CheckBoxList1.Items)
{
    if (item.Selected)
    {
        int CheckId = Convert.ToInt32(item.Value);
        cmd.CommandText = "INSERT INTO FarveTilCykel (fk_cy_id, fk_farve_id) VALUES (@cy, @farve)";

        cmd.Parameters.Add("@cy", SqlDbType.VarChar).Value = id;
        cmd.Parameters.Add("@farve", SqlDbType.VarChar).Value = CheckId;

        conn.Open();
        cmd.ExecuteNonQuery();
        conn.Close();
    } //end if
} //end foreach

问题是(我认为),当它运行 1 次并运行第二次时,@cy 已经声明,我怎样才能让它每次都不同?

【问题讨论】:

  • 在循环中创建每次命令新对象
  • 这适用于哪个 RDBMS?请添加标签以指定您使用的是mysqlpostgresqlsql-serveroracle 还是db2 - 或其他完全不同的东西。

标签: c# sql foreach sql-insert


【解决方案1】:

不能将相同的参数添加到命令中多次。您可以在每次迭代结束时Clear您的参数,例如;

foreach (ListItem item in CheckBoxList1.Items)
{
   ...
   ...
   cmd.Parameters.Clear();
}

或者更好的是,在你的 foreach 之前定义你的参数,然后只是在其中添加/更改它们的值。

var parameter1 = new SqlParameter("@cy", SqlDbType.VarChar);
var parameter2 = new SqlParameter("@farve", SqlDbType.VarChar);    
cmd.Parameters.Add(parameter1);
cmd.Parameters.Add(parameter2);

foreach (ListItem item in CheckBoxList1.Items)
{
   ...
   ...
   cmd.Parameters["@cy"].Value = id;
   cmd.Parameters["@farve"].Value = CheckId;
}

还可以使用using statement 自动处理您的连接和命令,而不是手动调用CloseDispose 方法。

【讨论】:

  • @CarolineOlivia 说声谢谢你很友善,但对read this: someone-answers 会更友善。如果这是您的解决方案,您应该接受它。这会关闭问题并向其他用户显示此问题,Soner Gönül 会对一些声望点感到满意!
【解决方案2】:

地点

var p1 = cmd.Parameters.Add("@cy", SqlDbType.VarChar);
var p2 = cmd.Parameters.Add("@farve", SqlDbType.VarChar);

在foreach块之前和

p1.Value = id;
p2.Value = CheckId;

在块内而不是当前的 2 行。

【讨论】:

    【解决方案3】:

    我更喜欢打开连接 (conn) 一次并将其写入 using 语句然后清除每条记录的参数 (cmd)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-04-22
      • 1970-01-01
      • 1970-01-01
      • 2013-01-05
      • 2021-04-03
      • 2019-05-22
      • 2016-06-09
      相关资源
      最近更新 更多