使用下面的代码,我可以将选中的复选框值插入数据库中的一行。在同一行中,添加日期,注释和另一个表中的Id编号(不是唯一的) 。在我的.aspx页面中有一个简单的treenode-checkboxes结构。
现在,我想从数据库表中自己的行中的复选框中插入每个选定的值。
例如:选中3个复选框:在数据库中插入3行,每行插入一个值(加上相同的日期,注释,所有这些的ID)。
请任何想法怎么做?
protected void btn_vac_Click(object sender, EventArgs e)
{
int id = Convert.ToInt32(Session["pa_id"]);
string vn = string.Empty;
if (TreeView1.CheckedNodes.Count > 0)
{
foreach (TreeNode node in TreeView1.CheckedNodes)
{
vn += string.Format("{0}", node.Text);
}
}
try
{
SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["RegistrationConnectionString"].ConnectionString);
conn.Open();
if (note_vac.Text.Length != 0)
{
string insert_emer = "insert into P_vaccines (V_name,P_Id,Note,Date) values (@vn,@p_id,@note,@Date) ";
SqlCommand com = new SqlCommand(insert_emer, conn);
com.Parameters.AddWithValue("@vn", string.Format("{0}", vn));
com.Parameters.AddWithValue("@p_id", id);
com.Parameters.AddWithValue("@note", note_vac.Text);
com.Parameters.AddWithValue("@Date", DateTime.Now.ToShortDateString());
com.ExecuteNonQuery();
}
else
{
string insert_emer = "insert into P_vaccines (V_name,P_Id,Date) values (@vn,@p_id,@Date) ";
SqlCommand com = new SqlCommand(insert_emer, conn);
com.Parameters.AddWithValue("@vn", string.Format("{0}", vn));
com.Parameters.AddWithValue("@p_id", id);
com.Parameters.AddWithValue("@Date", DateTime.Now.ToShortDateString());
com.ExecuteNonQuery();
}
Response.Write("<script>alert('Success!')</script>");
conn.Close();
}
catch (Exception ex)
{
Response.Write("Error :" + ex.ToString());
}
}
答案 0 :(得分:0)
您的代码可以简化很多。首先,您应该在检查索引上输入foreach循环之前准备命令。这意味着,在循环内创建连接和命令只需更新需要更改的参数值。这样的事情。
protected void btn_vac_Click(object sender, EventArgs e)
{
if (TreeView1.CheckedNodes.Count > 0)
{
try
{
string insert_text = "insert into P_vaccines (V_name,P_Id,Note,[Date]) values (@vn,@p_id,@note,@Date) ";
using(SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["RegistrationConnectionString"].ConnectionString))
using(SqlCommand com = new SqlCommand(insert_text, conn))
{
com.Parameters.Add("@vn", SqlDbType.NVarChar);
com.Parameters.Add("@p_id", SqlDbType.Int).Value = Convert.ToInt32(Session["pa_id"]);
com.Parameters.Add("@note", SqlDbType.NVarChar);
com.Parameters.Add("@Date", SqlDbType.NVarChar).Value = DateTime.Now.ToShortDateString();
conn.Open();
foreach (TreeNode node in TreeView1.CheckedNodes)
{
com.Parameters["@vn"].Value = node.Text;
com.Parameters["@note"].Value = note_vac.Text.Length > 0 ? note_vac.Text : DbNull.Value;
com.ExecuteNonQuery();
}
}
Response.Write("<script>alert('Success!')</script>");
}
catch (Exception ex)
{
Response.Write("Error :" + ex.ToString());
}
}
}
您的原始问题是由vn +=...
语句引起的,该语句将所有已检查的节点连接在一起。在此代码中,我使用当前检查的值直接在参数上更改该值。
另请注意,我已删除了is known to be pretty a bad practice的AddWithValue调用。但这意味着您应该精确确定传递给数据库引擎的值的数据类型。例如,作为字符串传递的日期时间非常可疑。
我还应该补充说,有一个名为Date的列非常混乱,因为有一个带有该名称的DataType,如果你想使用该列名,最好用方括号封装它以避免语法错误(或重命名列)