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");

の引数dt.Selectはフィルターです。"PROV_NEW"式はブール値にならないため、は有効なフィルターではありません。これをSQLと混同していると思います。SQLでは、単一の列を選択するように要求できます。ただし、後でPROV_NEW列から個別を選択する必要があるため、これを行う必要はありません。行全体が明確であることを確認したい場合は、これで十分です。

PROV_NEW列のみを比較する場合は、PROV_NEW列のみを参照するカスタム等式比較子を作成できます。distinct>このバージョン<で呼び出すときに、カスタム比較機能を参照できます。

または、 Grant Winneyは、個別を使用する前に、Linqを使用して単一の列のみを選択できることを提案しました。彼らの答えのコメントを参照してください。

于 2012-05-30T14:18:24.083 に答える
2

コードの次の行を確認してください。

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

PROV_NEWの後に別の値を入れるつもりでしたか?上記の行で正しく行ったので、それは単なる間違いだと思います。時々、2番目の目が助けになります。:)

于 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 に答える