You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 07:35:29