2012-04-16 47 views
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; 
      } 

當我執行上述具有較大場元素的數目的查詢,MS Access作爲查詢是太複雜和應用停止執行引發異常。 有沒有更好的書寫上面的查詢方法? 或者有什麼辦法避免這種異常?

+1

工會真的有必要嗎?難道你不只是在(「+ String.Join(」,「,fieldIdList)+」)「或沿着該行寫什麼Fields.FieldID? – kufi 2012-04-16 10:14:30

+0

」fieldIdList「中有多少項? – 2012-04-16 10:27:22

回答

0

如果你看一看Microsoft Access query limits,你可以找到許多And或限於99可能的查詢Or,你union作品像Or where子句中,所以如果你的工會的數量都大於99,手段你的列表計數,它會拋出一個異常,但我會建議嘗試使用In而不是union,但如果你的查詢的大小很大,這將無法正常工作,最好的選擇是你將使用分頁,意味着調用它對於大小爲100的列表,顯示結果,在再次顯示結果時將其稱爲接下來的100個項目等等。