首页 > 解决方案 > 使用 dataview.totable() 从 c# 数据表中删除重复行不适用于空行值

问题描述

在添加新行之前,我需要检查现有数据行(对于所有列)是否存在数据表中的可能重复项。目前使用向表dt1添加新数据行(使用itemarray)并比较现有表(dt1)和新表(dt1.dataview.totable(true))的行数的方法。但是,当行包含空/空值时,这似乎不起作用

| Col1 | Col2 |
|------|------|
|Abc   |      |
|      |Xyz   |

当我尝试添加一个新的数据行 -(Abc, )时,它被解释为一个不同的行。有没有办法使用 dataview.totable() 或 linq 方法来检查行是否已存在(需要检查所有列的值)或任何其他更简单的方法来处理此类空/空值?*数据表列动态更改,因此不能依赖列名

标签: c#asp.net.netasp.net-mvc

解决方案


哎呀,要么总是为“”输入 dbnull,要么总是为 dbnull 输入“”。

如果您没有在数据中采用一组 HARD 规则,那么将其编码出来将永远是一个真正的痛苦。计算机和代码必须有可靠的规则,如果你的设计很好,有点空白,但有点空 - 整个过程变得痛苦。这个“长时间”规则(在你的规则中 100% 定义)适用于所有代码——不仅仅是这个例子。

我认为对于这种情况?如果我们要忽略上述内容,我只会“正确编码”这个问题。(我的选择将始终为空 - 并针对表使用数据视图来过滤和签入一个操作。

但是,由于“”和空值之间的触发器?

然后只是蛮力编码出来。

这有效:

我来自 SQL 服务器的表:

SELECT FirstName, LastName, HotelName from tblHotels

上面被推到一个数据表中 - 可以有空值。

所以,现在我们的代码是这样的:

    object[] MySearch = new[] { txtFirst.Text, txtLast.Text, txtHotel.Text };

    bool bolFound = false;
    foreach (var MyRow in MyTable.Rows)
    {
        if (FindRow(MySearch, MyRow) == true)
        {
            bolFound = true;
            break;
        }
    }

    Response.Write("<h2>Results of search = " + bolFound.ToString() + "</h2>");
}

public bool FindRow(object[] MySearch, DataRow OneRow)
{
    object[] ar2;
    ar2 = OneRow.ItemArray;

    for (int i = 0; i <= Information.UBound(MySearch); i++)
    {
        if (Information.IsDBNull(ar2[i]))
        {
            if (MySearch[i] != "")
                return false;
        }
        else if (MySearch[i] != ar2[i])
            return false;
    }

    return true;
}

因此,您只需循环行 - 您的测试将数据表中的任何 db null 转换为“”。您假设您的搜索数组将始终使用 "" 而不是该数组中的 dbnull。

上面不是那么漂亮,但它不是大量的代码。


推荐阅读