發表文章

目前顯示的是 四月, 2015的文章

FireDAC dbExpress 效能之戰,使用DataSnap

圖片
打從接觸dbExpress(以下簡稱DBX)開始,對於DBX能否應用在實戰當中存在非常大的疑問。

但是ADO和FireDAC是屬於2-Tier架構元件,要和DBX這種屬於單向唯讀的元件比較,由於立足點不同,所以直接比較是非常奇怪的事情。

也許使用While Loop測試比較也可以;但測試結果與其說是測元件效能,說是測試電腦硬體效能應該更為貼切。

While not Query.Eof do
begin
  Query.FieldByName(FieldName).AsString...
  Something code...
  Query.Next();
end;

這樣的應用,現實設計卻很少在我們的專案中出現。
那麼這樣的測試方法,存在有以下兩點問題:

原來DBX4 Driver可以這樣更新

圖片
因為DBX4之後,這框架就進入維護期,RAD Studio XE各版就是Bug的修正。

剛拿XE7的dbxmss.dll到XE的環境下測試,居然可以正常使用。

原本XE下的BUG也確實有得到修正,太讚了!

只是到了XE7,還是有些許異常需要想辦法繞,使用起來還是毛毛的。


怎麼繞呢?就是原本在TSQLQuery下就可以做的調整,現在要移到TClientDataSet下來做才可以。

最後,證明3rd才是最優的解決方案!





Delphi DataSnap CORBA C/S 構築方式

MTDORB - Delphi向けCORBA実装

很意外的,居然還有人在使用CORBA技術,而且還有Open Source出來,可以免費使用。

它的名字是:MTDORB -- Multi-threaded Delphi ORB

文末的「 オープンソースを利用した 3層C/Sシステムの構築方法」是2006年的版本,在Delphi 2009後已經不知道要怎麼去建構CORBA Client……

但至少還是個希望,有機會可以試試看讓它復活。

參考資料:

MTDORB - Delphi向けCORBA実装業務管理システム開発の実例にみる,3層スタイルC/Sアプリ作成術3層スタイルC/Sアプリ作成術 サンプルプログラムソースオープンソースを利用した3層C/Sシステムの構築方法




Delphi XE Regular Expressions 單元中的 Bug

Report #: 87752 TRegEx frees FRegEx while TMatch et al still have a reference to it 這篇中有提到。

在 RegularExpressions 單元有個潛在的bug。 重現的方式也很簡單:
procedure TForm1.Button1Click(Sender: TObject); begin Button1.Caption := TRegEx.Match('one two', '\w+').NextMatch.Value; end;
會發現Button1.Caption變成空白,而不是預期的"one"。

詳細的解說在:
Bug in Delphi XE RegularExpressions Unit.

解決方式如下:
To fix this bug, delete or rename the two RegularExpressions.dcu files and copy RegularExpressions.pas into your source code folder. Make these changes to both the TMatch and TGroupCollection records in this unit:

Declare FNotifier: IInterface; in the private section.Add the parameter ANotifier: IInterface; to the Create constructor.Assign FNotifier := ANotifier; in the constructor’s implementation.
You also need to add the ANotifier: IInterface; parameter to the TMatchCollection.Create constructor.

修改完成後,把Debug和Release後的dcu,覆蓋($BDS)\lib\debug(release)目錄同名檔案即可。

附帶說明,在Delphi XE2以後已經修正了這個Bug,如果你有需要,請再留言索取。

參考資料…

dbExpress SetSchemaInfo 取得結構的勘誤之處

dbExpress的SetSchemaInfo一直以來都很接近ADO的OpenSchema
連取得的表格格式都很接近。
先來看看TADOConnection.OpenSchema和TSQLConnection.SetSchemaInfo各別取得的表格:
Get Primary Key Schema InformationADODBXTABLE_CATALOGRECNOTABLE_SCHEMACATALOG_NAMETABLE_NAMESCHEMA_NAMECOLUMN_NAMETABLE_NAMECOLUMN_GUIDINDEX_NAMECOLUMN_PROPIDPKEY_NAMEORDINALCOLUMN_NAMEPK_NAMECOLUMN_POSITIONINDEX_TYPESORT_ORDERFILTER 表1:ADO參數為"siPrimaryKeys",DBX為stIndexes
看起來一切是如此美好。
但沒想到在dbExpress 4之後,SetSchemaInfo做了一些調整
dbExpress 4下使用SQLConnection.SetSchemaInfo取得的表格居然是:
dbExpress 4: SetSchemaInfo stIndexesCatalogNameSchemaNameTableNameIndexNameConstraintNameIsPrimaryIsUniqueIsAscending 表2:DBX 4實際取得的Schema表格
結果COLUMN_NAME被取消了,如此一來,要使用DBX就無法直接使用SetSchemaInfo來取得Primary Key欄位。

只是,每一版The Structure of Metadata Datasets卻從來沒有更新及說明替代方法,實在是很讓人傷腦筋。

可參閱:
The Structure of Metadata Datasets with XEThe Structure of Metadata Datasets with XE2The Structure of Metadata Datasets with XE3The Structure of Metadata Datasets with XE4The Structure of Metadata Datasets with X…

FireBird測試使用的資料庫

每每要測試資料庫時都很煩腦沒有測試使用的資料庫。

常見的北風資料庫很不錯,但就是要安裝 SQL Server 這點就比較麻煩。

剛剛在這裡找到Borland Interbase 6.0搭載的範例資料庫,搭配Firebird emb上很好測試。

在這邊記錄一下連結:

mirrors for employee.gdb

Delphi IntraWeb 會計系統程式設計

圖片
IntraWeb(以下簡稱IW)是Delphi裡繼WebSnap後另一個網站設計解決方案。
許多Delphier認為IW不是個一回事。

不過如果IW真的這麼糟,能從3.x發展到現在的XIV,直接說它不堪使用也未免太過武斷。

今天為了證明IW實用性而找了一個專案來嘗試看看。

就以陳惟彬老師的ASP.NET會計系統來體驗試作。

為什麼要使用這本書?

這套系統是以ASP.NET 1.1 VB語言進行開發,有以下和IW共同的特色:
1.頁面設計採絕對定位,和Delphi VCL Form設計方式相同。
2.全面使用ASP.NET元件,剛好和IW元件形成對照組。

考量Delphier的不良習慣,限縮設計的手段:
1.全程不使用任何已知的HTML, CSS, JavaScript。
2.付費可以省工,TMS for IntraWeb參戰。

專案開發環境:

Delphi XEFireBird database 1.5 embedded (.Net framework not need!)IntraWeb XIV 14.0.23TMS IntraWeb Component Pack 5.4.1.1


與 VCL Form 設計比較不同的地方是:
1.為了配合AJAX(Asynchronous JavaScript and XML),在IW元件中,或多或少都有提供OnAsync事件,而要使用OnAsync事件時,必須要注意搭配元件的刷新。
以「新增子會科程式」為例,當TIWDBAdvWebGrid允許Async Edit時,就必須在.OnAsyncEdit事件寫上TIWDBAsyncNavigator元件變更處理,否則便出現 Grid 在編輯狀態,但Navigator卻沒有變化的搞笑情形。
2.TIWDBGrid和TDBGrid很像,但編輯功能還需要綁定其它TIWDBxxx元件。
3.新增功能:
  A.TIWDBGrid:無此功能,必須另外設計新增畫面。
  B.TIWDBAdvWebGrid:有新增功能,非常接近TDBGrid體驗。
4.TIWDBAdvWebGrid內建就有和ASP.NET Grid相同的分頁功能,這是DBGrid沒有的功能。

開發心得:
在開發時間緊迫的情形下,最終還是放棄OnAsync事件的使用。
開發過程中全都使用Delphi程式,開發習慣並沒有因為是網站開…