2021/04/26

Dbexpress (DBX) Factory for SQL SERVER

之前在這篇【那些年 DBeXpress 所教我的事:DBXCommon 單元】文章中提到 DBXCommon 是 Dbexpress (以下簡稱 DBX) 最底層的單元,像是 TDBXCommand 和 TDBXReader 便是 TSQLQuery 等 DBX DataSet 所包裝的內容,同時也是 DataSnap 底層架構,所以掌握 TDBXReader 就可說是掌握 DataSnap 效能這件事一點都不為過。

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 開發前篇 - 架構選擇

作者:吳祐賓

HTTP persistent connection.svg
由 helix84 - own work, based on [1], 公有領域, 連結

 


開發多層應用程式時,第一關就是面對【多次連線】和【持續連線】的選擇,雖然網路一面倒向多次連線才是王道,但實際真的適合自己嗎?

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" 錯誤

本文為【ebook【Delphi跨平台資料庫程式設計火速上手】電子書出版 (CHT)】的補充教材。

DataSnap 伺服器端可以設定的過濾器(Filter)有:

  • PC1 加密過濾器
  • RSA 加密過濾器
  • ZLIB 壓縮過濾器

伺服器端設定後,客戶端也需要進行相同設定,否則便無法使用。僅設定單一過濾器時,此時客戶端可以正確連線。