在WEB廣泛應用的時代,C/S結構不單是基於傳統的資料庫連接埠串連的方式。因為如果中間隔了網路代理程式、防火牆,連接埠資料則很容易被攔截。我們需要的是能開IE就能訪問的網路用戶端應用。
在此,我的用戶端採用的是DELPHI
然而一個問題在此就產生了。當java查詢出的資料是一個 List列表時,如何方便的匯入到DELPHI用戶端的表格顯示呢?不同人有不同的解決方案,有人採用Servlet返回XML來分析,有的用Servlet產生單個string傳遞然後去split,有人去採用自己的格式化剖析器然後填寫到StringGrid。
而我則選擇了一種更簡便的方式:TkbmMemTable組件+XFIRE。XFIRE發送資料能方便的利用HTTP來傳輸,而TkbmMemTable將資料存到TDataSet則能方便的使用和訪問,如果再加上TxQuery。哇。。。。那資料處理和顯示功能就更加強大了。
先看看傳遞一個資料表是如何的方便:
1.在TkbmMemTable定義要查詢出來表的各欄位,再設定Active=true。格式化組件採用TkbmCSVStreamFormat,預設設定即可。
2.使用JAVA的DAO查詢的List資料,使用MemTableRecBuilder(稍後介紹)建立成TkbmMemTable能讀取的CSV
3.將resultArray傳遞給用戶端,在此我使用了自己的一套擷取資料的通用WebService介面,不是本文的重點,因此忽略。因為不同人也有各自不同的資料傳遞方案。
4.將擷取的資料通過StringStream放入記憶體表
procedure TFormRecordServer.bsSkinButtonsBarSections0Items0Click(
Sender: TObject);
var
strStream: TStringStream;
begin
kbmMemTablePrjInf.EmptyTable;
strStream := TStringStream.Create(DataUtil.findRecordingPrjInf); //讀取的資料string
if strStream.Size > 0 then
kbmMemTablePrjInf.LoadFromStream(strStream); //這樣就把資料全部傳遞到了TkbmMemTable
strStream.Free;
end;
沒有多餘的代碼,除了XFIRE傳遞資料的採用自己的方式外,編碼和讀取就上面這麼簡單的代碼。接下來公布我自己編寫的TkbmMemTable CSV資料格式化器:
package com.aherp.voice.util;
public class MemTableRecBuilder ...{
private static final String CSV_QOUTE = """;
private static final char CSV_RECORD_DELIMITER = ',';
private static final String CSV_TRUE_STRING = "True";
private static final String CSV_FALSE_STRING = "False";
private StringBuffer strbuf;
private ThreadLocal<Integer> fieldCount = new ThreadLocal<Integer>();
public MemTableRecBuilder()...{
strbuf = new StringBuffer();
fieldCount.set(0);
}
public MemTableRecBuilder buildField(Object fieldData)...{
int fieldCountInt = fieldCount.get();
if(fieldCountInt > 0)
strbuf.append(CSV_RECORD_DELIMITER);
fieldCount.set(fieldCountInt + 1);
strbuf.append(CSV_QOUTE);
if(fieldData instanceof String)...{
strbuf.append(
((String)fieldData).replace(CSV_QOUTE, """")
.replace("%", "%%")
.replace(" ", "%c")
.replace(" ", "%n"));
}
else if(fieldData instanceof Boolean)...{
if((Boolean)fieldData)
strbuf.append(CSV_TRUE_STRING);
else
strbuf.append(CSV_FALSE_STRING);
}
else
strbuf.append(fieldData);
strbuf.append(CSV_QOUTE);
return this;
}
public MemTableRecBuilder newRow()...{
strbuf.append(' ');
fieldCount.set(0);
return this;
}
public String toString()...{
return strbuf.toString();
}
}
再提醒一點,對於bool型資料的儲存,kbmmemtable中是由其格式化器CSVStreamFormat的CSVFalseString和CSVTrueString的兩個屬性決定的