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;
        }
    }
}

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

4

4 回答 4

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

for 的参数dt.Select是一个过滤器。"PROV_NEW"不是有效的过滤器,因为表达式不会产生布尔值。我相信您将此与 SQL 混淆了,您可以在其中要求它选择单个列。但是您不需要这样做,因为稍后您需要从 PROV_NEW 列中选择 distinct。如果你想确保整行是不同的,那么这就是你需要做的。

如果您只想比较 PROV_NEW 列,您可以编写一个自定义相等比较器,它只查看您的 PROV_NEW 列。distinct当您使用 > this version <调用时,您可以引用您的自定义比较器。

或者, Grant Winney建议您可以在使用 distinct 之前使用 Linq 仅选择单个列。请参阅他们答案中的评论。

于 2012-05-30T14:18:24.083 回答
2

检查代码中的以下行:

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

您的意思是在 PROV_NEW 之后添加另一个值吗?您在上面的行中正确地做到了,所以我假设这只是一个错误。有时第二双眼睛会有所帮助。:)

于 2012-05-30T14:16:59.200 回答
1

看起来这条线是错误的:

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

DataTable 需要过滤表达式作为参数,“PROV_NEW”不是过滤表达式。有关详细信息,请参阅MSDN 文档

于 2012-05-30T14:18:02.290 回答
1

检查表达式“PROV_NEW”的结果。在某处,某些方法正在寻找结果布尔类型,而您的表达式正在产生其他结果。我的 2 美分:)

于 2012-05-30T14:21:18.583 回答