为何C#中ds.Equals(ds2)判断不生效?如何比较DataSet/DataTable
问题原因分析
1. Equals方法的本质问题
DataSet是引用类型,默认的Equals方法比较的是对象的引用地址,而非内部的数据内容。哪怕两个DataSet里的数据完全一致,只要是不同的实例,ds.Equals(ds2)就会返回false,这就是判断失效的核心原因。
2. 代码里的其他潜在问题
- SQL注入风险:直接把用户输入拼接进SQL语句,属于严重的安全漏洞,必须用参数化查询替代。
- 拼写错误:SQL语句里的
usernaem是拼写错误,正确应为username,这会导致删除语句永远无法匹配到正确的用户。 - 逻辑冗余:用
SqlDataAdapter.Fill()执行DELETE语句完全不合理,Fill是用来填充查询结果的,执行修改操作应该用SqlCommand.ExecuteNonQuery(),还能直接获取受影响的行数,更高效地判断删除是否成功。
正确比较DataSet/DataTable的方法
比较DataSet
需要逐表逐行逐列进行比对:遍历两个DataSet的所有DataTable,再逐个遍历每个表的行和列,逐一比较对应位置的值。
比较DataTable的常用方法
1. 手动遍历比对
public bool AreDataTablesEqual(DataTable dt1, DataTable dt2) { // 先判断行列数是否一致 if (dt1.Rows.Count != dt2.Rows.Count || dt1.Columns.Count != dt2.Columns.Count) return false; // 逐行逐列比较值 for (int rowIndex = 0; rowIndex < dt1.Rows.Count; rowIndex++) { for (int colIndex = 0; colIndex < dt1.Columns.Count; colIndex++) { if (!dt1.Rows[rowIndex][colIndex].Equals(dt2.Rows[rowIndex][colIndex])) return false; } } return true; }
之后遍历DataSet的Tables集合,调用此方法逐个比较对应表即可。
2. 转XML字符串比较
把两个DataTable导出成XML字符串,再比较字符串是否相等,适合数据量较小的场景:
public bool AreDataTablesEqual(DataTable dt1, DataTable dt2) { using (StringWriter sw1 = new StringWriter()) using (StringWriter sw2 = new StringWriter()) { dt1.WriteXml(sw1); dt2.WriteXml(sw2); return sw1.ToString().Equals(sw2.ToString()); } }
更合理的业务逻辑(推荐)
完全没必要通过DataSet比较来判断删除结果,直接执行DELETE语句后获取受影响的行数即可,代码更简洁高效:
con.Open(); // 参数化查询,避免SQL注入+修正拼写错误 string deleteSql = "DELETE FROM tbl_users WHERE username = @username AND password = @password"; SqlCommand cmd = new SqlCommand(deleteSql, con); cmd.Parameters.AddWithValue("@username", txtusername.Text); cmd.Parameters.AddWithValue("@password", txtPassword.Text); int affectedRows = cmd.ExecuteNonQuery(); if (affectedRows == 0) { MessageBox.Show("用户名或密码错误,删除失败", "删除失败", MessageBoxButtons.OK, MessageBoxIcon.Error); txtusername.Text = ""; txtPassword.Text = ""; txtComPassword.Text = ""; } else { MessageBox.Show("账号删除成功", "成功", MessageBoxButtons.OK, MessageBoxIcon.Information); } con.Close();
内容的提问来源于stack exchange,提问作者KBJ
相关产品推荐
相关产品推荐

