Hy ..我有一个包含5个选项的复选框。我想将选中的值插入一个以','分隔的表中。这是我的代码:
string str = string.Empty;
foreach (ListItem item in this.checkbox1.Items)
{
if (item.Selected)
{
str = str + ",";
}
}
SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["chestionar"].ConnectionString);
SqlCommand cmd = new SqlCommand("INSERT INTO Raspunsuri Values('" + str + "',@cnp,@data,'10')", con);
cmd.Parameters.AddWithValue("@cnp", Session["sesiune_cnp"]);
cmd.Parameters.AddWithValue("@data", DateTime.Now.ToLocalTime());
try
{
con.Open();
cmd.ExecuteNonQuery();
Response.Redirect("User11.aspx");
}
catch (Exception ex)
{
Console.WriteLine("Error:" + ex);
}
finally
{
con.Close();
}
我的问题是,当我点击插入按钮时,它不会插入用户选中的值。我必须为字符串str赋值。这个值是什么?
答案 0 :(得分:3)
string str = string.Empty;
foreach (ListItem item in this.checkbox1.Items)
{
if (item.Selected)
{
str = str + ",";
}
}
问题是str
永远不会有值,所以你只是在数据库中写一系列逗号 - 每个项目都有一个逗号。
您需要在字符串中添加其他内容以确定选择了哪些选项 - 可能是item.Value
。所以你的代码将成为:
if (item.Selected)
{
str += item.Value + ",";
}
但是,使用这样的字符串连接效率不高,因为它需要每次都重新创建字符串对象(字符串是不可变的)。因此,使用StringBuilder
可以提高代码效率。
字符串以逗号结尾也可以吗?如果没有,很容易删除:
str = str.TrimEnd(new char[] { ',' })
答案 1 :(得分:0)
变化:
StringBuilder values = new StringBuilder();
if (item.Selected)
{
if (sb.Length) > 0
values.Append(","); // To ensure that the last char is not a comma after the loop
values.Append(item.value);
}
SqlCommand cmd = new SqlCommand("INSERT INTO Raspunsuri Values(@str,@cnp,@data,'10')", con);
添加:
cmd.Parameters.AddWithValue("@str", values.ToString());
因此我们通过将值作为参数传递来删除可能获得的sql注入。另外,要获取ListItem的选定值,请使用Value属性。
现在你要做的就是将值添加到stringbuilder中(你不需要使用stringbuilder,但如果列表框中有很多值,它会更有效。)
从StringBuilder
答案 2 :(得分:0)
首先:避免循环中string
的连接。 C#
中的字符串是不可变的,因此您在每次迭代时都会分配一个新内存。使用StringBuilder()
及其Append()
方法。
永远不要直接将字符串写入SQL
。 总是使用参数。所以你的代码必须看起来像这样:
SqlCommand cmd = new SqlCommand("INSERT INTO Raspunsuri Values (@stringvalue,@cnp,@data, @tenvalue)", con);
cmd.Parameters.AddWithValue("@stringvalue", str);
cmd.Parameters.AddWithValue("@cnp", Session["sesiune_cnp"]);
cmd.Parameters.AddWithValue("@data", DateTime.Now.ToLocalTime());
我认为,通过解决这个问题,您也可以解决问题。
祝你好运。答案 3 :(得分:0)
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace MultipleCheckBoxesApp
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
string _concateString = "";
private void checkBoxButton_Click(object sender, EventArgs e)
{
List<string> ourList = new List<string>();
if (csharpCheckBox.Checked)
{
ourList.Add(csharpCheckBox.Text);
}
if (javaCheckBox.Checked)
{
ourList.Add(javaCheckBox.Text);
}
if (cCheckBox.Checked)
{
ourList.Add(cCheckBox.Text);
}
if (phpCheckBox.Checked)
{
ourList.Add(phpCheckBox.Text);
}
if (cplusCheckBox.Checked)
{
ourList.Add(cplusCheckBox.Text);
}
foreach (string checkList in ourList)
{
_concateString += checkList + " ,";
}
if (_concateString == string.Empty)
{
MessageBox.Show("Nothing Checked", "Error",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
else
{
MessageBox.Show(_concateString + " has been checked");
}
ourList.Clear();
_concateString = string.Empty;
}
}
}