【发布时间】:2021-12-11 04:58:49
【问题描述】:
我有两个外键表,第一个是:
tblFile : FileID, FileName...
第二个是:
tblChild(在 Datagridview 中):ChildID、ChildName、ChildBirthDate、fkFileID。
单击保存按钮时(在表单中),如果行(添加或编辑或删除),我如何更新第二个表中的所有行? (例如:https://i.postimg.cc/jq7Ks3CW/1.jpg)
我试过了:
public void dgvChildUpdate(DataGridView dgv, TextBox txtID)
{
string ChID;
DataTable dtNew = (DataTable)dgv.DataSource;
DataTable dtDel = dtNew.GetChanges(DataRowState.Deleted);
if (dtDel != null)
{
for (int i = 0; i < dtDel.Rows.Count; i++)
{
SqlCommand cmd = new SqlCommand("DELETE FROM tblFileChild WHERE ChildID = @ChildID", ClsDB.con);
//cmd.Parameters.AddWithValue("@ChildID", dtDel.Rows[i]["ChildID"].ToString());
cmd.ExecuteNonQuery();
}
}
dtDel = null;
using (SqlCommand cmd = new SqlCommand("SELECT * FROM tblChild WHERE fkFileID = @FileID", ClsDB.con))
{
SqlDataAdapter da = new SqlDataAdapter(cmd);
cmd.Parameters.AddWithValue("@FileID", txtID.Text);
DataTable dt = new DataTable();
da.Fill(dt);
if (dt.Rows.Count > 0)
{
for (int t = 0; t < dt.Rows.Count; t++)
{
ChID = dt.Rows[t]["ChildID"].ToString();
for (int i = 0; i < dgv.Rows.Count; i++)
{
if (ChID == dgv.Rows[i].Cells[5].Value.ToString())
{
using (SqlCommand cmdChild = new SqlCommand("UPDATE tblChild SET ChildName = @ChildName, ChildBirthDate = @ChildBirthDate WHERE ChildID = @ChildID", ClsDB.con))
{
cmdChild.Parameters.AddWithValue("@ChildID", dgv.Rows[i].Cells[0].Value);
cmdChild.Parameters.AddWithValue("@ChildName", dgv.Rows[i].Cells[1].Value ?? DBNull.Value);
cmdChild.Parameters.AddWithValue("@ChildBirthDate", dgv.Rows[i].Cells[2].Value ?? DBNull.Value);
cmdChild.ExecuteNonQuery();
}
}
}
}
}
foreach (DataGridViewRow rowCh in dgv.Rows)
{
ChID = rowCh.Cells[5].Value.ToString();
if (ChID == string.Empty)
{
using (SqlCommand cmdChild = new SqlCommand("INSERT INTO tblChild (ChildName, ChildBirthDate, fkFileID) VALUES (@ChildName, @ChildBirthDate, (SELECT FileID FROM tblFile WHERE FileID = @FileID))", ClsDB.con))
{
cmdChild.Parameters.AddWithValue("@ChildName", rowCh.Cells[1].Value ?? DBNull.Value);
cmdChild.Parameters.AddWithValue("@ChildBirthDate", rowCh.Cells[3].Value ?? DBNull.Value);
cmdChild.Parameters.AddWithValue("@FileID", txtID.Text.Trim());
cmdChild.ExecuteNonQuery();
}
}
}
}
【问题讨论】:
-
我可以向您展示如何使这变得非常简单,但您可能不得不接受丢弃大部分已编写的内容..
-
好的,我会尝试..继续..
-
不要使用addwithvalue
-
我稍后会输入它;得到一个 conf 调用 atm.. SMor 的意思是“不要将 AddWithValue 与 SQLServer 一起使用”,但这不是解决您当前问题的方法,更多的是关于良好 SQLS 查询实践的一般建议
标签: c# sql-server