我正在使用以下功能使用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会因为查询过于复杂而应用程序停止执行而引发异常。 有没有更好的方法来编写上面的查询? 或者有没有办法避免这种例外?
答案 0 :(得分:0)
如果您查看Microsoft Access query limits,您可以在可能的查询中找到And
或Or
的数量限制为99,您的union
就像{{1}一样在where子句中,所以如果您的工会数量大于99,表示您的列表计数,它会抛出异常,但我建议尝试使用Or
而不是In
但是如果您的查询大小很大,这将不起作用,并且您将使用分页的最佳选项,意味着将其调用为大小为100的列表,显示结果,在表示结果期间再次为下一个项目调用它,依此类推。