2019/09/23

Auto set up the TDBXParameters DataType

圖/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


=== 2019/10/20 更新 ===

由於自動化不是那麼方便,在網路上持續尋找可行的方案。

意外發現網路有高手將 TDBXCommand 和 Variant 結合自動化,做出類似 TDataSet.Locate 的操作。

官方Driver裡有個:Prepare SQL參數
當它為【True】時,TDBXCommand.Prepare後即會自動把Parameters和DataType建立完成, 我們只需填值即可。

DBXDevartSQLServer則無【Prepare SQL】參數,屬無效設定。

因應此點,我稍微對程式碼做了一下調整並放在 Github,有興趣的朋友請到 See also 瀏覧下。

有任何想法請讓我知道。 ^_^

See also

沒有留言:

張貼留言