在数据表中的值中插入多行

时间:2016-01-17 11:10:01

标签: c# asp.net

使用下面的代码,我可以将选中的复选框值插入数据库中的一行。在同一行中,添加日期,注释和另一个表中的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());
            }

    }

1 个答案:

答案 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,如果你想使用该列名,最好用方括号封装它以避免语法错误(或重命名列)