我正在尝试在数据表中搜索非唯一值,并且我一直收到此错误
过滤器表达式'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;
}
}
}
因为你可以看到我在数据表中搜索唯一的行,当抛出异常时我真的去保存数据。并且它给出了高于上面的误差。
答案 0 :(得分:4)
DataRow[] dupresults = dt.Select("PROV_NEW");
dt.Select
的参数是一个过滤器。 "PROV_NEW"
不是有效的过滤器,因为表达式不会导致布尔值。我相信你会把它与SQL混淆,在那里你可以要求它选择一个列。但是您不需要这样做,因为稍后您需要从PROV_NEW列中选择不同的。如果你想确保整行是不同的,那么这就是你需要做的全部。
如果您只想比较PROV_NEW列,您可以编写一个自定义相等比较器,仅查看您的PROV_NEW列。当您使用&gt; this version &lt;。
致电distinct
时,您可以引用自定义比较器
或者Grant Winney建议您在使用distinct之前可以使用Linq仅选择单个列。请参阅their answer中的评论。
答案 1 :(得分:2)
检查代码中的以下行:
DataRow[] dupresults = dt.Select("PROV_NEW");
您是不是要在PROV_NEW之后再添加一个值?你在上面的行中正确地做了,所以我假设它只是一个错误。有时第二双眼睛有帮助。 :)
答案 2 :(得分:1)
看起来这条线路错了:
DataRow[] dupresults = dt.Select("PROV_NEW");
DataTable需要过滤器表达式作为参数,“PROV_NEW”不是过滤器表达式。有关详细信息,请参阅MSDN Documentation。
答案 3 :(得分:1)
检查表达式“PROV_NEW”的结果。在某个地方,某些方法正在寻找一个结果的布尔类型,并且你的表达式会产生其他东西。我的2美分:))