如果在.NET DataTable中违反主键,如何跳过DataRow插入

时间:2015-03-27 18:18:28

标签: c# .net

我有以下DataTable和复合主键。第4次通过for循环,将违反复合密钥。怎么说,如果这一行会导致密钥被违反,不要将它添加到DataRowCollection中?我只想在我的DataTable中根据三个键唯一的行。感谢

DataTable DTRejects = new DataTable("RejectedInvoicesDT");
DTRejects.PrimaryKey = new DataColumn[]
                      {
                          DTRejects.Columns.Add("OperatorName"),
                          DTRejects.Columns.Add("ProcessType"),
                          DTRejects.Columns.Add("RejectedReason")
                       };

  for (int i = 0; i < RowIndex; i++)
  {
  if (arrStatus[i].ToString() == "Rejected")
    {
        DataRow DRRejects = DTRejects.NewRow();
            DRRejects[0] = arrOperatorName[i].ToString();
            DRRejects[1] = arrProcessType[i].ToString();
            DRRejects[2] = arrRejectedReason[i].ToString();
    DTRejects.Rows.Add(DRRejects);
}
 }

2 个答案:

答案 0 :(得分:0)

应用逻辑上不同的先验。使用LINQ和Distinct很容易。

例如:

 var statuses = Range(0, RowIndex)
     .Where(i => "Rejected".Equals(arrStatus[i]))
     .Select(i => new {
         OperatorName = Convert.ToString(arrOperatorName[i]),
         ProcessType = Convert.ToString(arrProcessType[i]),
         RejectedReason = Convert.ToString(arrRejectedReason[i]),
     })
     .Distinct();

 foreach (var status in statuses)
 {
    dtRejects.Rows.Add(new object [] {
      status.OperatorName, status.ProcessType, status.RejectedReason
    });
 }

答案 1 :(得分:0)

您正在使用DataTable的泛型类型,但如果您创建一个Strong Typed数据集,您也可以使用设计器创建强类型DataTable。

在强类型数据表上,您可以使用设计器定义主键。 您可以启用或禁用约束检查。 根据主键值的值,您可以使用易于使用的find方法查看表。

因此,很容易检测到密钥是否已经存在。 当然使用linq这也很容易,因为user2864740在他的回答中指出,但我在linq存在之前已经使用了强类型数据集,并且它们也起作用,结果是非常易读的代码。