2017/11/29
2017/11/27
Statistically compare performance : Step sum total and Aggregates sum total (CHT)
有時我們會需要加總 DataSet 裡的某個欄位資訊給使用者,讓使用者可以很快速的掌握全局。
加總的方法很多,在資料庫典型的作法是:
SELECT SUM(Field) FROM Table
在 Delphi 中,我們常用的作法是這樣:
2017/11/20
Delphi 往 Web 方向發展,然後呢?
11/17 (五) 聽了 Embarcadero 網路研討會後,大致上有幾個重點:
ExtJS 開發在這次的研討會並沒有全面性的展示,講師表示會在下一次研討會裡專門講解。
目前後端沒有多作延伸,依然是以 WebBroker 為基底,來看看 WebBroker 在目前 Delphi 裡的框架位階:
由圖可知,WebBroker 是非常底層的框架,它囊括了 HTTP 必要的元素,如 Request, Response 等,非常陽春,但原料豐富,相對靈活性極佳……
- WebBroker 可以在 Linux 上運行 (已經實現)
- RAD Studio IDE 將會增加 ExtJS 的前端框架
- 可能支援 JavaScript code insight
ExtJS 開發在這次的研討會並沒有全面性的展示,講師表示會在下一次研討會裡專門講解。
目前後端沒有多作延伸,依然是以 WebBroker 為基底,來看看 WebBroker 在目前 Delphi 裡的框架位階:
由圖可知,WebBroker 是非常底層的框架,它囊括了 HTTP 必要的元素,如 Request, Response 等,非常陽春,但原料豐富,相對靈活性極佳……
2017/11/15
Service Oriented Architecture with WebBroker
在 Embarcadero Technologies Youtube 上看到一篇關於【從零打造以服務導向的WebBroker】,底下將它內嵌過來:
前半部描述的是 SOAP,把 TRemotable 和 SOAP API 的搭配交待得很清楚,輔以 TRemotable 後,SOAP 服務可以更直覺的開發。
前半部描述的是 SOAP,把 TRemotable 和 SOAP API 的搭配交待得很清楚,輔以 TRemotable 後,SOAP 服務可以更直覺的開發。
2017/10/08
Forever without restarting IIS - ISAPI Loader
Eggcentric ISAPI Loader is update the ISAPI dll solution.
Update your ISAPI DLL while in USE and without restarting IIS!!
I have a name is "ZooISAPI.dll" in ISAPI DLL.
How to use?
Step 1: Rename "ZooISAPI.dll" to "ZooISAPI.run"
Step 2: Copy "ISAPILoader_NODEBUG.dll" or "ISAPILoader_DEBUG.dll" to same path.
Step 3: The file rename to "ZooISAPI.dll"
Step 4: When update ISAPI dll. Rename the new version "ZooISAPI.dll" to "ZooISAPI.update", and move to IIS ISAPI path.
Step 5: Sleep(10000); :P
Step finish: The ISAPI Loader will unload the .run and rename it to .backup and then rename the .update to .run and then load the .run
Yeah!! Update our ISAPI DLL while in USE and without restarting IIS, forever!!
See also:
2017/10/01
DBX framework 初探 (二) - In FireDAC
上回介紹了 DBX framework 的好處,我們來看看實作的程式碼:
var
LDBXConn: TDBXConnection;
LCmd: TDBXCommand;
LReader: TDBXReader;
begin
LDBXConn := SQLConnection1.DBXConnection;
LCmd := LDBXConn.CreateCommand;
LCmd.Text := 'SELECT * FROM employee';
LReader := LCmd.ExecuteQuery;
...
LCmd.Close;
LCmd.Free;
end;
由上面的原始碼可以看出,DBX framework 是建立在 dbExpress 上,但 FireDAC 的 TFDConnection 沒有內建 DBX framework,難道魚和熊掌不可兼得嗎?
當然可以!
FireDAC 是個海納百川的元件組
使用的元件組是:
- TFDConnection.
- TFDPhysTDBXDriverLink.
FireDAC 的連線精靈很方便,只需注意:
- Driver ID = TDBX (DBX4) or DBX (DBX v1~v3)
- DriverName = 參考 dbExpress 區的 Driver Name (如 MSSQL、IBLite 等)
若有購買 dbExpress 3rd driver,在 FireDAC 包裝下,可以直接使用 TFDQuery,再也不用 TSQLQuery, TDataSetProvider, TClientDataSet 三個元件、三個步驟了。
哎呀,被你發現還有後續內容啦。
FDConnection 包裝 dbExpress 後,利用 TFDCustomConnection.CliObj,DBX 元件組便可以利用它,再透過轉型的方式重現。
CliObj = Call Level Interface Object. (白話文是:切到【手動排檔】模式)
它的包裝單元很豐富,表格如下:
| Driver | Wrapping class and unit |
|---|---|
| Advantage | TFDSConnection, FireDAC.Phys.ADSWrapper.pas |
| dbExpress (v <= 3) | ISQLConnection |
| InterBase, Firebird | TIBDatabase, FireDAC.Phys.IBWrapper.pas |
| MySQL | TMySQLSession, FireDAC.Phys.MySQLWrapper.pas |
| Microsoft SQL Server | TODBCConnection, FireDAC.Phys.ODBCWrapper.pas |
| Microsoft Access | TODBCConnection, FireDAC.Phys.ODBCWrapper.pas |
| IBM DB2 | TODBCConnection, FireDAC.Phys.ODBCWrapper.pas |
| Sybase SQL Anywhere | TODBCConnection, FireDAC.Phys.ODBCWrapper.pas |
| ODBC | TODBCConnection, FireDAC.Phys.ODBCWrapper.pas |
| Oracle | TOCIService, FireDAC.Phys.OracleWrapper.pas |
| PostgreSQL | TPgConnection, FireDAC.Phys.PgWrapper.pas |
| SQLite | TSQLiteDatabase, FireDAC.Phys.SQLiteWrapper.pas |
| TDBX (v >= 4) | TDBXConnection, FireDAC.Phys.TDBX.pas |
| DataSnap | TDBXConnection, FireDAC.Phys.TDBX.pas |
| MongoDB | TMongoConnection, FireDAC.Phys.MongoDBWrapper.pas |
之後只要改一行文字即可,如以下紅字內容:
var
LDBXConn: TDBXConnection;
LCmd: TDBXCommand;
LReader: TDBXReader;
begin
LDBXConn := TObject(FDConnection1.CliObj) as TDBXConnection;
LCmd := LDBXConn.CreateCommand;
LCmd.Text := 'SELECT * FROM employee';
LReader := LCmd.ExecuteQuery;
...
LCmd.Close;
LCmd.Free;
end;
警告:效能控請小心服用!
結語:
DBX framework 打從問市以來一直在傳達「以貼近底層的方式發揮程式最大效能」的概念。
但現實的程式設計市場是以【包裝便利】取勝。
從多數 Delpher 對 BDE、ADO 至死不渝,可以看出 Delphi 市場的真實偏好。
官方 FireDAC 的出現,可以看出 Delphi 對市場的妥協。
好的產品不一定賣,會賣的一定是對消費者有價值的產品。
對我們來說,能夠簡化工作量的才是有價值的工具。
在 DBX framework 是加重工作量,而 FireDAC 能簡化開發工作量,對多數的 Delphier 來說,這才是有價值的。
同樣是開發產品的我們,DBX framework 歷史教訓值得學習 ── 要做有價值的產品。
然而,DBX framework 所帶來架構設計上的轉變是不容忽視的,秘密就在……
文內表格裡的彩蛋,您發現了嗎?
See also:
- Connect to dbExpress Data Source (FireDAC)
- FireDAC.Comp.Client.TFDCustomConnection.CliObj
- 用delphiXE7 dbExpress Framework提供的功能获取数据表信息
- execute dynamic sql in datasnap client
2017/09/26
DBX framework 初探
DBX 框架在官方手冊裡有句話引起我的注意:
Currently, using a TDBXValue is the fastest way to pass a parameter, because these are the internal objects used to manage parameter lists.
新的 DBX 系列元件,如 TDBXCommand, TDBXReader 等,似乎和以前的 TDataSet 有所區別,和 TDataSet 的耦合性相當低。
架構相當底層,和直接呼叫 Driver API 大概只有一線之隔,這也是效能最好的原因。
但也因為如此,手刻程式碼相對變多,以前 TDataSet 會幫忙做的,像是 Params、FieldDefs 自動產生功能等,現在都要自己做,程式碼巨量增加,這成就感還不錯。
【效能】和【程式碼增加】一舉兩得,若你在視程式
訂閱:
文章 (Atom)









