同时使用“删除”和“插入”命令更新表格?

时间:2012-02-13 04:02:16

标签: c# asp.net

我开发了一个基于网络的培训矩阵,显示了公司所在部门每个部门的每位员工的培训记录。除了一件事,一切都很好;当管理员更新某些员工的培训记录并点击“更新”按钮时,他会立即看到他的最新更新,但在他再次更新矩阵一段时间后,他将看不到他之前输入的数据。他们将消失,我不知道为什么。我检查了数据库,也没有数据,也没有机构触及数据库。真的很奇怪。

我开发了更新功能(删除和插入),而不是使用Update。我认为现在的问题是删除功能。我需要以这样的方式修改它,以便特定于下面显示的不是每个人的确定员工,那么如何做到这一点?

Code-Behind(C#代码):

protected void Page_Load(object sender, EventArgs e)
{

    DataView dv2 = (DataView)SqlDataSource1.Select(DataSourceSelectArguments.Empty);
    foreach (DataRowView group in dv2)
    {
        SqlDataSource2.SelectParameters[0].DefaultValue = group[0].ToString();
        //create a new HtmlTable object
        HtmlTable table = new HtmlTable();

        DataView dv = (DataView)SqlDataSource2.Select(DataSourceSelectArguments.Empty);
        int columns = dv.Table.Columns.Count;
        int rows = dv.Count;

        //table's formating-related properties
        table.Border = 2;
        table.CellPadding = 3;
        table.CellSpacing = 3;
        table.Width = "900px";

        //to get the css style
        table.Attributes["class"] = "uGrid";

        //create a new HtmlTableRow and HtmlTableCell objects
        HtmlTableRow row;
        HtmlTableRow header = new HtmlTableRow();
        HtmlTableCell cell;


        //for adding the headers to the table
        foreach (DataColumn column in dv.Table.Columns)
        {
            HtmlTableCell headerCell = new HtmlTableCell("th");
            headerCell.InnerText = column.Caption;
            header.Cells.Add(headerCell);
        }
        table.Rows.Add(header);

        //loop for adding rows to the table
        foreach (DataRowView datarow in dv)
        {
            row = new HtmlTableRow();
            //row.BgColor = "yellow";


            //loop for adding cells
            for (int j = 0; j < columns; j++)
            {
                cell = new HtmlTableCell();
                if (j < 4)
                {
                    cell.InnerText = datarow[j].ToString();
                }
                else
                {

                    CheckBox checkbox = new CheckBox();

                    int checkBoxColumns = dv.Table.Columns.Count - 5;
                    string fieldvalue = datarow[j].ToString();
                    string yes = fieldvalue.Split(new string[] { ", " }, StringSplitOptions.RemoveEmptyEntries)[1];
                    string courseid = fieldvalue.Split(new string[] { ", " }, StringSplitOptions.RemoveEmptyEntries)[0];
                    checkbox.ID = row.Cells[3].InnerText + "," + courseid.Trim();
                    checkbox.Checked = yes.Equals("Yes");
                    cell.Controls.Add(checkbox);

                }

                //add the cell to the current row
                row.Cells.Add(cell);
            }

            //add the row to the table
            table.Rows.Add(row);
        }

        //add the table to the page
        PlaceHolder1.Controls.Add(table);

    }
}


protected void updateButton_Click(object sender, EventArgs e)
{
    string connString = "Data Source=localhost\\sqlexpress;Initial Catalog=psspTest;Integrated Security=True";
    string deleteCommand = "DELETE FROM employee_courses where employeeID=@employeeID";
    string insertCommand = "INSERT INTO employee_courses (employeeId, CourseID) values(@employeeId, @CourseID)";

    using (SqlConnection conn = new SqlConnection(connString))
    {
        conn.Open();
        using (SqlCommand cmd = new SqlCommand(deleteCommand, conn))
        {
            cmd.ExecuteNonQuery();
        }
    }

    foreach (Control ctrl in PlaceHolder1.Controls)
    {
        if (ctrl is HtmlTable)
        {
            HtmlTable table = (HtmlTable)ctrl;
            foreach (HtmlTableRow row in table.Rows)
            {
                foreach (HtmlTableCell cell in row.Cells)
                {
                    foreach (Control c in cell.Controls)
                    {
                        if (c is CheckBox)
                        {
                            CheckBox checkbox = (CheckBox)c;
                            if (checkbox.Checked)
                            {
                                string fieldvalue = checkbox.ID;
                                string employeeID = fieldvalue.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries)[0];
                                string courseID = fieldvalue.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries)[1];

                                using (SqlConnection conn = new SqlConnection(connString))
                                {
                                    conn.Open();
                                    using (SqlCommand cmd = new SqlCommand(insertCommand, conn))
                                    {
                                        //Now the insert
                                        cmd.CommandText = insertCommand;
                                        cmd.Parameters.Clear(); //need this because still has params from del comm
                                        cmd.Parameters.AddWithValue("@employeeId", employeeID);
                                        cmd.Parameters.AddWithValue("@CourseID", courseID);
                                        cmd.ExecuteNonQuery();
                                    }
                                }

                            }

                        }
                    }
                }
            }

        }

    }

    Response.Redirect("KPIReport.aspx");
}

问题在于:

protected void updateButton_Click(object sender, EventArgs e)
    {
        string connString = "Data Source=localhost\\sqlexpress;Initial Catalog=psspTest;Integrated Security=True";
        string deleteCommand = "DELETE FROM employee_courses where employeeID=@employeeID";
        string insertCommand = "INSERT INTO employee_courses (employeeId, CourseID) values(@employeeId, @CourseID)";

        using (SqlConnection conn = new SqlConnection(connString))
        {
            conn.Open();
            using (SqlCommand cmd = new SqlCommand(deleteCommand, conn))
            {
                cmd.ExecuteNonQuery();
            }
        }

        foreach (Control ctrl in PlaceHolder1.Controls)
        {
            if (ctrl is HtmlTable)
            {
                HtmlTable table = (HtmlTable)ctrl;
                foreach (HtmlTableRow row in table.Rows)
                {
                    foreach (HtmlTableCell cell in row.Cells)
                    {
                        foreach (Control c in cell.Controls)
                        {
                            if (c is CheckBox)
                            {
                                CheckBox checkbox = (CheckBox)c;
                                if (checkbox.Checked)
                                {
                                    string fieldvalue = checkbox.ID;
                                    string employeeID = fieldvalue.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries)[0];
                                    string courseID = fieldvalue.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries)[1];

                                    using (SqlConnection conn = new SqlConnection(connString))
                                    {
                                        conn.Open();
                                        using (SqlCommand cmd = new SqlCommand(insertCommand, conn))
                                        {
                                            //Now the insert
                                            cmd.CommandText = insertCommand;
                                            cmd.Parameters.Clear(); //need this because still has params from del comm
                                            cmd.Parameters.AddWithValue("@employeeId", employeeID);
                                            cmd.Parameters.AddWithValue("@CourseID", courseID);
                                            cmd.ExecuteNonQuery();
                                        }
                                    }

                                }

                            }
                        }
                    }
                }

            }

        }

        Response.Redirect("KPIReport.aspx");

1 个答案:

答案 0 :(得分:1)

似乎您没有为删除命令设置@EmployeeID,如下所示:

protected void updateButton_Click(object sender, EventArgs e)
{
    //COMMAND DEFINED
    string deleteCommand = "DELETE FROM employee_courses where employeeID=@employeeID";

    using (SqlConnection conn = new SqlConnection(connString))
    {
        conn.Open();

        //COMMAND CREATED
        using (SqlCommand cmd = new SqlCommand(deleteCommand, conn))
        {
            //COMMAND EXECUTED, BUT @employeeID NOT SET ANYWHERE
            cmd.ExecuteNonQuery();
        }
    }

尝试以下:

//TO KEEP TRACK OF EMPLOYEE IDS FOR WHICH WE HAVE ALREADY EXECUTED 
//DELETE STATEMENT
IList<string> _deleted=new List<string>();

foreach (Control ctrl in PlaceHolder1.Controls)
{
    ...........
    .........

    if (c is CheckBox)
    {
        CheckBox checkbox = (CheckBox)c;
        if (checkbox.Checked)
        {
            string fieldvalue = checkbox.ID;
            string employeeID = fieldvalue.Split(new string[] { "," }, 
                                   StringSplitOptions.RemoveEmptyEntries)[0];
            string courseID = fieldvalue.Split(new string[] { "," }, 
                                   StringSplitOptions.RemoveEmptyEntries)[1];

            if(!_deleted.Contains(employeeID))
            {
                using (SqlConnection conn = new SqlConnection(connString))
                {
                   conn.Open();
                   using (SqlCommand cmd = new SqlCommand(deleteCommand, conn))
                   {
                      cmd.Pararmeters.AddWithValue("@employeeId", employeeID);
                      cmd.ExecuteNonQuery();
                      //DON'T EXECUTE DELETE FOR ALL CHECKED ROWS
                      _deleted.Add(employeeID);
                   }
                }
            }

            using (SqlConnection conn = new SqlConnection(connString))
            {
                conn.Open();
                using (SqlCommand cmd = new SqlCommand(insertCommand, conn))
                {
                   //Now the insert
                   cmd.CommandText = insertCommand;
                   //DON'T NEED TO CLEAR AS YOU HAVE CREATED NEW COMMAND IN 
                   //USING STATEMENT
                   //cmd.Parameters.Clear();
                    cmd.Parameters.AddWithValue("@employeeId", employeeID);
                    Cmd.Parameters.AddWithValue("@CourseID", courseID);
                    cmd.ExecuteNonQuery();
                }
            }
        }
        .....................
        .....................
    }
    .....................
    .....................
}