查询过于复杂的访问异常?

时间:2012-04-16 10:03:22

标签: c# ms-access c#-4.0

我正在使用以下功能使用fieldId list动态地形成查询。

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

当我使用大量字段元素执行上述查询时,MS Access会因为查询过于复杂而应用程序停止执行而引发异常。 有没有更好的方法来编写上面的查询? 或者有没有办法避免这种例外?

1 个答案:

答案 0 :(得分:0)

如果您查看Microsoft Access query limits,您可以在可能的查询中找到AndOr的数量限制为99,您的union就像{{1}一样在where子句中,所以如果您的工会数量大于99,表示您的列表计数,它会抛出异常,但我建议尝试使用Or而不是In但是如果您的查询大小很大,这将不起作用,并且您将使用分页的最佳选项,意味着将其调用为大小为100的列表,显示结果,在表示结果期间再次为下一个项目调用它,依此类推。