2012-05-30 68 views
1

我试图寻找非唯一值的数据表中,我不断收到此错误保持抛出一个错误,我不知道为什么

筛选表达“PROV_NEW”不计算为布尔项。

当我运行它。

这是我的代码:

public class GetData 
{ 
    datalogiclayer.TableSetup dal; 
    DataSet ds; 

    public delegate void InvalidTableDataDelegate(string ErrorMessage); 
    public event InvalidTableDataDelegate InvalidTableData; 

    public delegate void SetupDataLoadedDelegate(System.Data.DataSet dv, string TableName); 
    public event SetupDataLoadedDelegate SetupDataLoaded; 

    public GetData() 
    { 
     dal = new datalogiclayer.TableSetup(); 
    } 

    public void Update(DataSets.Setup ds) 
    { 
     try 
     { 
      string errMsg = string.Empty; 

      if (ValidateTable(ds.SETUP_MWPROV, out errMsg)) 
      { 
       dal.UpdateDatabase(ds); 
      } 
      else 
      { 
       if (InvalidTableData != null) 
        InvalidTableData(errMsg); 
      } 
     } 
     catch (Exception) 
     { 
      throw; 
     } 
    } 

    private bool ValidateTable(DataSets.Setup.SETUP_MWPROVDataTable dt, out string TableIssues) 
    { 
     try 
     { 
      //NewCode not used for other row 
      DataRow[] result = dt.Select("PROV_NEW = ''"); 
      DataRow[] dupresults = dt.Select("PROV_NEW"); 
      TableIssues = string.Empty; 
      DataTable dtTemp = dt.DefaultView.ToTable(true, "NEW_PROV"); 

      if (dupresults.Length == 0) 
      { 
       return true; 
      } 
      else 
      { 
       IEnumerable<DataRow> uniqueCodes = dupresults.AsEnumerable().Distinct(DataRowComparer.Default); 

       Console.WriteLine("Unique Provider Codes:"); 

       foreach (DataRow NEW_PROV in uniqueCodes) 
       { 
        Console.WriteLine(NEW_PROV.Field<Int32>("PROV_NEW")); 
       } 

       return false; 
      }   
     } 
     catch (Exception) 
     { 
      throw; 
     } 
    } 
} 

所以你可以看到我有搜索DataTable中的唯一行,当被抛出的异常是,当我真正去保存数据。它给出了上面的错误。

+0

如果你想要非独立的,你需要选择不同的,然后为每个不同的选择对结果,看看是否出现2个或更多。 –

回答

4
 DataRow[] dupresults = dt.Select("PROV_NEW"); 

dt.Select的参数是一个过滤器。 "PROV_NEW"不是有效的过滤器,因为表达式不会生成布尔值。我相信你会把这个与SQL混淆,在那里你可以要求它选择一个列。但是你不需要这样做,因为之后你需要选择不同的PROV_NEW列。如果你想确保整行不同,那么这就是你需要做的。

如果您只想比较PROV_NEW列,则可以编写自定义相等比较器,该比较器仅查看PROV_NEW列。当您致电distinct>this version <时,您可以参考您的自定义比较器。

或者Grant Winney建议您在使用distinct之前,可以使用Linq来仅选择单列。请参阅their answer中的注释。

+0

但是,不会只是搜索空白的条目,我试图找到重复的条目。 – Kobrien

+0

@Kobrien检查更新。我明白你现在想要做什么。 –

+0

啊,好的,谢谢。这工作。 – Kobrien

2

检查你的代码下面一行:

DataRow[] dupresults = dt.Select("PROV_NEW"); 

您的意思是把另一个值PROV_NEW后?你在上面的行中正确地做了,所以我认为这只是一个错误。有时会有第二双眼睛帮助。 :)

+0

好的,但是这行的情况需要改变。我仍然在学习C#,所以对于所有事情都还没有很好的感觉。 – Kobrien

+0

@Kobrien你想成为dupresults值的结果是什么? –

+0

它期望您将PROV_NEW与其他值进行比较,就像您在上面的行中所做的一样。 –

1

它看起来像这条线是错误的:

DataRow[] dupresults = dt.Select("PROV_NEW"); 

DataTable的需求筛选表达式作为参数,而“PROV_NEW”不是一个过滤器表达式。有关更多信息,请参阅MSDN Documentation

1

检查表达式“PROV_NEW”的结果。某处,某种方法正在寻找一个结果布尔类型,并且表达式导致了其他内容。我的2美分:)

+0

''PROV_NEW“'是一个字符串,而不是一个类型。 –

+0

字符串是一种引用类型,即使它具有值类型的大多数特征 – foxtrotZulu

+0

不会争辩说您的选择方法需要特定的变量或事实上这是一个字符串..只是字符串是引用类型。 – foxtrotZulu

相关问题