2012-05-30 86 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

相關問題