代码之家  ›  专栏  ›  技术社区  ›  jeffcook2150

迭代时的参数化查询

  •  0
  • jeffcook2150  · 技术社区  · 14 年前

    我正在向数据库中插入一个Web表单,因此使用参数化查询。我有一个复选框列表。我如何迭代检查框列表,为每一个被检查的对象(多对多)创建一个insert语句,并使这个参数化并在一个Swoop中执行?

    我现在有这个:

    string query = "INSERT INTO resources (url, submitted_by, author_name) VALUES (@url, @submitted_by, @author_name);";
    foreach (ListItem li in CheckBoxList1.Items)
        {
            if (li.Selected = true)
            {
                query += "; INSERT INTO ";
            }
        }
        SqlCommand cmd = new SqlCommand(query, conn);
        cmd.Parameters.AddWithValue("@url", TextBox1.Text);
        cmd.Parameters.AddWithValue("@submitted_by", TextBox2.Text);
        cmd.Parameters.AddWithValue("@author_name", TextBox3.Text);
    
        try
        {
            conn.Open();
            cmd.ExecuteNonQuery();
            Label1.Text = "Added to database.";
        }
    

    正如你所看到的,它还没有完成。有什么建议吗?

    1 回复  |  直到 14 年前
        1
  •  1
  •   tzaman    14 年前

    可以使用Linq为集合中的每个项生成唯一的命名参数,然后在后面的中添加关联的值:

    var builder = new StringBuilder();
    var listParams = CheckBoxList1.Items
                         .Where(li => li.Selected)
                         .Select(li, idx => new 
                         {
                             PhoneString = String.Format("@phone_id{0}", idx),
                             PhoneValue = GetPhoneId(li),
                             ResourceString = String.Format("@resource_id{0}", idx),
                             ResourceValue = GetResourceId(li)
                         };
    foreach (var param in listParams)
    {
        builder.AppendFormat("INSERT INTO phones_resources (phone_id, resource_id) 
                              VALUES ({0}, {1});", 
                              param.PhoneString, param.ResourceString);
    }
    SqlCommand cmd = new SqlCommand(builder.ToString(), conn);
    foreach (var param in listParams)
    {
        cmd.Parameters.AddWithValue(param.PhoneString, param.PhoneValue);
        cmd.Parameters.AddWithValue(param.ResourceString, param.ResourceValue);
    }
    

    我假设你有某种联系方式 phone_id, resource_id 从任何给定的 ListItem -你可以把它插到我放占位符的地方 Get___ 功能。

    注:切换到A StringBuilder -它比用重复的方法建立一个字符串要好得多。 += .