查詢乙個列表,每個列表項有對應的一組明細記錄(這裡稱為含明細列表).這是開發過程中常見的應用場景.如查詢訂單列表,同時返回每個訂單的明細。
umx協議支援crowset的列是乙個crowset(dtrowset型別),但umx.js未實現.
如果在服務端完成分拆,則返回多個crowset.umx限制的最大行集數是65535.
一般方法是,1個crowset表示列表內容,後面按出現在列表crowset的順序依次跟隨每個記錄的明細crowset.
一種實現方法是先查詢列表,然後對查詢結果的每條記錄對應的明細逐一查詢。
假設一次查詢頁的大小為20條.則需要查詢資料庫21次。
迴圈是影響效能的常見原因.
可以對此進行優化,明細查詢一次完成.總共只進行2次查詢.
**示例:
string strsql = ///< 查詢訂單列表sql.
int ret = pagizequerytomsg(strsql,strorderby,pin,pans); ///< 執行列表查詢,獲得訂單列表
crowset* prs = pans->getrowset(0);/// prs是查詢訂單列表的crowset
prs->first();
vectorvs;
while(!prs->iseof())
string in_str;
mergestring(vs,in_str);///< 合併成in表示式
strsql = logmsg("select sheetid,goodsid,qty from t_orderitem where sheetid in (%s) order by sheetid",in_str.c_str());
if (querytomsgex(strsql,"sheetid",1,vs,pans))
return -1;
實現的主要函式querytomsgex定義和實現在cqqbase.h的cqqbaseplugin.
///< 函式:querytomsgex
///< 根據key_fld把查詢結果順序儲存到pmsg的行集中
///< 引數:
///< strsql: 查詢sql
///< key_fld:key欄位名稱
///< remove_key_fld:是否從行集中刪除key欄位
///< vs:物件key列表
///< pmsg:輸出crowset的訊息物件
///< 返回值: 0:成功 -1:失敗
int querytomsgex(const string& strsql,const string &key_fld,bool remove_key_fld,vector&vs,cmsg *pmsg,const string &strdbc="");
注意使用限制:
.必須有乙個單一列的key.示例為sheetid
.明細查詢必須包含key欄位,並且必須按key排序. 如果協議定義不要求返回key,可以設定querytomsgex的remove_key_fld引數為true.
實現是針對5210協議優化的.見cmpm::onquerypurchaselist方法.
實現querytomsgex,在query_func.h中增加了2個公共匯出函式:
int recordsetfieldtorowset(crecordset *prs,crowset *rs) ///< 資料庫查詢記錄集的字段轉換到crowset列資訊
int recordtorowset(crecordset *prs,crowset *rs) ///< 把查詢記錄轉換為crowset記錄
外掛程式開發技術說明 15 檔案自動分目錄儲存
用途 當檔案數量很大,在單一目錄下時無法容納,需要把檔案自動分散到不同的目錄下.特性 指定乙個 home目錄,可限定每個目錄下最多檔案數量 分級目錄儲存,如 home 1,home 2.在 home 1下再分目錄儲存,以保證可容納足夠數量的檔案.按每個目錄最大檔案數2000個計算,3級可儲存的檔案數...
VS外掛程式開發(1 選單)
最近工作需要,學習一些外掛程式的開發。ide平台不是.net開發的。用起來比較累。在visualstudio裡建立 visualstudio外接程式。選單主要的工作方法 onconnection querystatus exec connectmode 列舉,執行模式 ext cm aftersta...
c 外掛程式式開發1
mef 原文 首先,新建乙個類庫,裡面定義介面,這裡定義兩個方法,乙個有返回值的,乙個無返回值的。using system using system.collections.generic using system.text namespace imsg 將上面的類庫生成imsg.dll,新建乙個類...