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