之前在這篇【那些年 DBeXpress 所教我的事:DBXCommon 單元】文章中提到 DBXCommon 是 Dbexpress (以下簡稱 DBX) 最底層的單元,像是 TDBXCommand 和 TDBXReader 便是 TSQLQuery 等 DBX DataSet 所包裝的內容,同時也是 DataSnap 底層架構,所以掌握 TDBXReader 就可說是掌握 DataSnap 效能這件事一點都不為過。
2021/04/26
2021/04/19
Delphi 特規 JSON 和 JavaScript Object (2)
前情提要:Delphi 特規 JSON 和 JavaScript Object (1)
已知大匠可以將 Blob 型態轉為 Hex JSON Array,但容量會放大 4 倍是硬傷;而 Memo 型態卻也被視為 Blob 型態,導致傳輸內容更加地龐大,更有堪者,可達放大 6 倍之譜。
追綜原因
Delphi 轉換 JSON 封包主要是利用 TDBXJSONTools.TableToJSON 函式庫內容,它會利用 TDBXReader.ValueType 進行 Delphi Value to JSON Value 轉換:
JsonCell := DBXToJSON(Value.Value[I], Value.ValueType[I].DataType, IsLocalConnection);
而 DBXToJSON 裡對 DataType 解析,節錄如下:
2021/04/16
Delphi 特規 JSON 和 JavaScript Object (1)
Delphi 開發這麼久,一直對 TFDMemTable 等 TDataSet 轉成 JSON 內容很有意見,在預設條件下,產出的是【特規】JSON 格式,如下圖所示:
為了方便說明,底下【特規 JSON 】一律使用【DJSON 】代換。
一般 JavaScript 前端大部份的物件所接受的 JSON 格式會是:
[{"EmpNo":2,"LastName":Nelson"}, {"EmpNo":4,"LastName":Eden"}]
Delphi 預設的格式不適用在前端,而 10.2 版開始有提供轉換函式來產出前端常用的 JSON 格式。
特規有特規的好處
當時為了達到這功能的我感到非常困惑,為什麼這功能要等這麼久才能實現?
後來想想,其實這特規確實有存在的必要。
因為,剛剛我們有看到前端常用的 JSON 格式會有【欄位名稱重複】的情形,像是上述的 EmpNo, LastName 每一筆都會出現一次,當筆數一多時,過多的重複資料會產生不必要的傳輸量,這時採用 DJSON 格式反而會是比較好的選擇。
前端的硬體效能都堪比伺服器,在前端轉換更能有效分配資源。
2021/03/23
DataSnap 開發前篇 - 架構選擇
What is Encryption in Delphi? (2)
DataSnap Server 有提供 PC1 加密過濾器,一開始什麼都用官方預設值,運作下沒有問題,但就是 Key 值都是固定,就來修改一下吧。
同步修改後運作也是正常,正常的測完後,就要來試試【如果伺服端和客戶端密碼不同時會跳出什麼錯誤】。
結果
居然仍能運作!
這就怪了,為什麼兩邊的 KEY 值不同卻能運作無誤?
在經過測試後,它會經過幾個單元:
- DBXTransport
- DBXEncryption
DBXEncryption.TPC1Cypher 類別裡有 Cypher / Decypher 加解密函式,就進行測試,才知道每對封包加密傳遞給對方時,KEY 也會在包在其中一同傳給對方,對方再使用該 KEY 進行封包解密,反之亦然。
簡單的說就是:用 KEY 搭配【相同】演算法解密該封包才能夠正確解密。
所以要知道正確的演算法才是關鍵,雖然只要是 Delphi 的應用程式就必定可以解開,但以 Delphi 這麼小眾的情形下也算得上一種良好的加密法則。(笑)
See also
2021/03/05
SQL SERVER 儲存 BLOB 檔案 BCP, CLR, OLE 功能差異
這一陣子遇到需要將 BLOB 欄位轉成實體檔案的需求,主要應用在發送電子郵件上,不查還好,一查也是水很深的技術問題。
前提:必須開啟 SQL SERVER 存取實體磁碟的權限
SQL SERVER 存取實體磁碟工作大多屬底層控制,而 DML 操作是在 Instance 下處理,並不會直接對實體磁碟控制,之前 SQL Injection 等資訊安全事件頻傳,為了安全性,SQL SERVER 對實體磁碟的控制選項預設值是關閉的,所以如果必須對實體磁碟控制,就必須先將其開啟。
文章目錄
2021/03/02
DataSnap Clinet 建立過濾器後連線出現 "Connection Closed Gracefully" 錯誤
DataSnap 伺服器端可以設定的過濾器(Filter)有:
- PC1 加密過濾器
- RSA 加密過濾器
- ZLIB 壓縮過濾器
伺服器端設定後,客戶端也需要進行相同設定,否則便無法使用。僅設定單一過濾器時,此時客戶端可以正確連線。








