c# - 使用 dataview.totable() 从 c# 数据表中删除重复行不适用于空行值
问题描述
在添加新行之前,我需要检查现有数据行(对于所有列)是否存在数据表中的可能重复项。目前使用向表dt1添加新数据行(使用itemarray)并比较现有表(dt1)和新表(dt1.dataview.totable(true))的行数的方法。但是,当行包含空/空值时,这似乎不起作用
| Col1 | Col2 |
|------|------|
|Abc | |
| |Xyz |
当我尝试添加一个新的数据行 -(Abc, )
时,它被解释为一个不同的行。有没有办法使用 dataview.totable() 或 linq 方法来检查行是否已存在(需要检查所有列的值)或任何其他更简单的方法来处理此类空/空值?*数据表列动态更改,因此不能依赖列名
解决方案
哎呀,要么总是为“”输入 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。
上面不是那么漂亮,但它不是大量的代码。
推荐阅读
- solr - Solr:重新加载查询时同义词而不重新加载集合
- django - 如何为 put 方法提供初始数据,Django(我想创建编辑个人资料页面)
- php - 6 个月后将用户状态从 0 更改为 1
- assembly - 这个对吗?
- python - 如何在 Python 列表中添加和扩展新行?
- swift - 如何在 Swift 中将对象传递给新引用
- python - 在不同时间从同一来源获取字典值并进行比较
- imagemagick - 使用 ImageMagick 从 RAW 图像中删除背景
- angular - Angular 2:将数据从服务传递到组件
- bash - 如何在 bash 程序中运行命令?