我试图弄清楚我的数据表是否包含某一行。所以我使用了.Contains方法,但是当我尝试运行我的程序时遇到了一个MissingPrimaryKeyException,我无法弄明白。
DataTable table = dataQuery.executeQuery();
foreach(DataRow row in table.Rows)
{
if(table.Rows.Contains("certainRow"))
{
blah blah blah
...
我只是在第二次调用table时出现异常。这对我来说是没有意义的。如果我的桌子上没有主键,那么它在foreach通话中是否会给我一个错误?
编辑:我刚才意识到Contains做了别的事情,而不是我想的。 Matthijs ......是的,这就是我想要的。我需要知道" certainRow"实际上是一行存在,否则我无法操纵该行中的数据。不幸的是,我是C#的新手并且在5年以上的任何事情中都没有编程,所以我无法弄清楚是否有一种方法能够满足我的需求。或者如果我需要自己创造一些东西。
编辑#2: 我使用DataTableReader找到了解决问题的方法。
private bool doesExist(string rowName, DataTable table)
{
bool value = false;
DataTableReader reader = new DataTableReader(table);
while (reader.Read())
{
for (int i = 0; i < reader.FieldCount; i++)
{
if (reader.GetValue(i) == rowName)
{
value = true;
}
}
}
return value;
}
答案 0 :(得分:0)
您应该可以使用DataTableReader
,可以找到更多信息here。
一个例子是:
private static DataTable GetCustomer()
{
DataTable table = new DataTable();
DataColumn id = table.Columns.Add(@"Id", typeof(int));
table.Columns.Add(@"Name", typeof(string));
table.PrimaryKey = new DataColumn[] { id };
table.Rows.Add(new object[] { 1, @"John" });
return table;
}
上面的代码将构建一个表,因为您看到定义了Primary Key
并添加了内容。这就是你构建表的方式。现在阅读,你会:
using(DataTableReader reader = new DataTableReader(new DataTable[] { customer }))
{
do
{
if(reader.HasRows)
{
// Do Something
}
} while (reader.NextResult());
}
如您所见,它验证行存在,然后执行任务。非常简单的例子,希望它有所帮助。
.Contains
将返回boolean
的真值或假值。
关于您的评论,您可以致电reader[@"ColumnName"]
,它应该尝试在没有问题的情况下阅读。所以如果:
if(reader[@"ColumnName"] != DBNull.Value)
{
// Do Something.
}
答案 1 :(得分:0)
你可以写:
bool contains = table.Rows.Cast<DataRow>().SelectMany(r => r.ItemArray).Contains(value);