圖/VManninen@flickr |
好消息! dbExpress driver 增加對 Linux 平台的支援!
緣起
本以為 dbExpress 不再更新後就要比 BDE 提早領便當,成了史上最悲劇的官方資料庫存取技術代表。
然而在 Devart 的巧手下,2019年又讓 dbExpress 再一次跨好跨滿跨平台。❤❤❤
聽到這個消息超開心的,2002 Borland 時期 Kylix的未竟之夢,總算在 2019 由 Idera / Embarcadero 圓夢完成,真是太感動了!
感動之餘,也想到 DataSnap 轉到 Linux 主機上,是否應該作些準備?
前面提到的【DevExtreme DataGrid Demo with DataSnap Server】章節,已經知道前端要採用與 Delphi 無綠的 JavaScript 應用,而前端最常用的 TClientDataSet / TFdMemTable 也就不會再使用,面對 JavaScript,最終是要包成 JSON。
既然不會再使用 Delphi 前端元件,那資料庫來源在不妨礙開發為前提下能多底層就底層。
有想法,就來試試看!
取得資料
在【DBX framework 初探】說到 TDBXCommand 這個物件是個提高存取效能的好東西,範例也相當簡單:可以看到 TDBXCommand 可以順利取得所有資料。
加上參數就悲劇
說明書提到 TDBXCommand.Prepare 會自動把 Parameters 建立完成,結果……0 個參數!這是怎麼一回事?看看手冊,原文是這樣寫的:
If no parameters have been set up, the driver supports parameter metadata and the dynamic SQL statement contains parameters, Prepare sets up the command's parameters.原來是 driver!上述的語句在對 InterBase 上是正確可以取得參數的,表示 DBX 的 MS SQL driver 並不支援 MetaData 的取得。
Driver 不支援,那就動手做一組
雖然無法依賴 Driver 取得 MetaData,但總有方式可以突破──自己寫!在範例中,必須要先知道 TableName,才能利用 TDBXCommand 查出它的所有欄位及欄位格式。
知道欄位格式後,再轉化為 TDBXParameter.DataType,為了方便觀看轉換結果,又再補上【GetPlatformTypeName】函式。
所以我們就可以知道所有欄位的型態。
結合原式
知道所有的欄位型態後要填入參數就變得不是問題。結論
感覺起來 TSQLQuery 幫忙做了好多事,使用 TDBXCommand 在硬要自動化的前題下真的能節省許多操作時間嗎?邀請大家一起來解題,有任何想法請讓我知道。
以上
See also
- DBX framework 初探
- DBX framework 初探 (二) - In FireDAC
- Data.DBXCommon.TDBXCommand.Prepare
- dbExpress Framework Compatibility
- Data.DBXMetaDataReader.TDBXPlatformTypeNames.GetPlatformTypeName
- Search a String array in Delphi
- New in dbExpress Drivers: Support for 64-bit versions of macOS and Linux
=== 2019/10/20 更新 ===
由於自動化不是那麼方便,在網路上持續尋找可行的方案。
意外發現網路有高手將 TDBXCommand 和 Variant 結合自動化,做出類似 TDataSet.Locate 的操作。
官方Driver裡有個:Prepare SQL參數
當它為【True】時,TDBXCommand.Prepare後即會自動把Parameters和DataType建立完成, 我們只需填值即可。
DBXDevartSQLServer則無【Prepare SQL】參數,屬無效設定。
因應此點,我稍微對程式碼做了一下調整並放在 Github,有興趣的朋友請到 See also 瀏覧下。
有任何想法請讓我知道。 ^_^
See also
沒有留言:
張貼留言