0

次の関数を使用して、fieldIdリストを使用して動的にクエリを作成しています。

    public List<CompareDesignGroup> GroupFields(List<string> fieldIdList)
            {
                StringBuilder sb = new StringBuilder();

                foreach (string fieldId in fieldIdList)
                {
                    sb.Append("'" + fieldId + "',");
                }

                string fieldList = sb.ToString().TrimEnd(',');

                string queryString = "";
                int i = 0;
                foreach(string fieldId in fieldIdList)
                {
                    queryString = queryString + " Select FieldID , CDGroups.Name,
 CDCaption, IIF(ISNULL(Priority),99,Priority), " + i + " from Fields LEFT OUTER 
JOIN CDGroups ON Fields.CDGroupID = CDGroups.CDGroupID 
WHERE Fields.FieldID = '" + fieldId + "' ";
                    if (i < fieldIdList.Count - 1)
                    {
                        queryString = queryString + " union ";
                    }
                    i++;
                }
                queryString = queryString + " order by 4,5 ";

//DatReaderリーディングパート...

                dataReader = settingsData.ReadSettingsData(queryString);

                if (!dataReader.HasRows)
                {
                    return null;
                }

                List<CompareDesignGroup> compareDesignGroupList = new List<CompareDesignGroup>();
                while (dataReader.Read())
                {
                    CompareDesignGroup compareDesignGroup = new CompareDesignGroup();

                    compareDesignGroup.CdGroup = dataReader["Name"].ToString();
                    compareDesignGroup.FieldId = dataReader["FieldID"].ToString();
                    compareDesignGroup.CdCaption = dataReader["CDCaption"].ToString();

                    compareDesignGroupList.Add(compareDesignGroup);
                }

                return compareDesignGroupList;
            }

多数のフィールド要素を使用して上記のクエリを実行すると、クエリが複雑すぎてアプリケーションの実行が停止するため、MSAccessは例外をスローします。上記のクエリを書くためのより良い方法はありますか?またはこの例外を回避する方法はありますか?

4

1 に答える 1

0

Microsoft Accessのクエリ制限を見ると、クエリのAnd数がOr99に制限されていることがわかります。これは、where句のunionようOrに機能します。したがって、ユニオンの数が99より大きい場合は、リストの数を意味します。例外がスローされますが、In代わりに使用することをお勧めしunionますが、クエリのサイズが大きい場合、これは機能しません。ページングを使用するのが最善のオプションです。つまり、サイズ100のリストを呼び出すことを意味します。結果、結果を表すときに、次の100項目などを再度呼び出します。

于 2012-04-16T10:37:26.453 に答える