在三層架構的圖書管理系統中,包含客戶端、伺服器處理端與資料伺服器。客戶端發送請求,伺服器端透過 ADO 連接 Access 資料庫查詢,將結果格式化為 XML 並封裝成 SOAP 訊息透過 Socket 回傳客戶端,客戶端解析後顯示給使用者。
核心流程:接收請求 → ADO 查詢 → Recordset 轉 XML → 封裝 SOAP → Socket 發送
//************************ 封裝成 SOAP 訊息發送回客戶端 ************************//
int MaxRows = 0; // 取得總列數
while (!pRs->EndOfFile) {
MaxRows++;
pRs->MoveNext();
}
pRs->MoveFirst(); // 必須移回第一列
int nFields = pRs->Fields->GetCount(); // 取得欄位總數
CMarkup xml;
xml.SetDoc("\r\n");
xml.AddElem("RESULT");
for (int j = 0; j < MaxRows; j++) {
xml.AddChildElem("BOOK");
xml.IntoElem();
for (int k = 0; k < nFields; k++) { // 取得欄位名與值
_bstr_t name = pRs->Fields->GetItem((long)k)->GetName();
_bstr_t value = pRs->Fields->GetItem((long)k)->GetValue();
xml.AddChildElem((char*)name, (char*)value);
}
xml.OutOfElem();
pRs->MoveNext();
}
xml.Save("Temp.xml");
// 讀取 XML 檔案並透過 Socket 發送
CFile file;
file.Open("Temp.xml", CFile::modeRead | CFile::typeBinary);
byte buf[64 * 1024];
memset(buf, 0, 64 * 1024);
file.ReadHuge(buf, file.GetLength());
send(m_sockClient[i], (char*)buf, file.GetLength() + 1, 0);
file.Close();
關鍵技術點:使用 CMarkup 類別簡化 XML 操作,作者特別感謝其作者的貢獻,並推薦大家使用此類別處理 XML 解析與生成。
接收資料 → 存檔 → 載入 XML → 遍歷節點 → 顯示於 ListCtrl
CFile file;
file.Open("Temp.xml", CFile::modeCreate | CFile::typeBinary | CFile::modeWrite);
file.WriteHuge(recvBuf, strlen(recvBuf));
file.Flush();
file.Close();
CMarkup xml;
if (!xml.Load("Temp.xml")) {
MessageBox("載入 XML 檔案失敗!");
return;
}
int item = 0;
xml.ResetMainPos(); // 確保指標移至開頭
while (xml.FindChildElem("BOOK")) {
int subItem = 0;
xml.IntoElem(); // 進入 BOOK 節點
m_listCtrl.InsertItem(item, "", 0); // 插入一列
CString index;
index.Format("%d", item + 1); // 序號
m_listCtrl.SetItemText(item, subItem, index);
while (xml.FindChildElem()) { // 迴圈取得子節點值
xml.IntoElem();
CString value = xml.GetData(); // 取得值
m_listCtrl.SetItemText(item, subItem + 1, value);
subItem++;
xml.OutOfElem();
}
item++;
xml.OutOfElem(); // 離開 BOOK 節點
}
| 層級 | 技術 | 說明 |
|---|---|---|
| 資料層 | ADO + Access | Recordset 查詢結果集 |
| 邏輯層 | CMarkup + XML | 資料序列化為 XML |
| 傳輸層 | Socket + SOAP | 原始 Socket 模擬 SOAP 傳輸 |
| 表現層 | CMarkup + ListCtrl | XML 解析並顯示 |
改進方向:可考慮引入成熟的 SOAP 庫(如 gSOAP)、改用 HTTP 傳輸、加入 WSDL 定義、實作錯誤處理與重試機制,提升系統健壯性與互通性。