2015/04/25

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;

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

2015/04/23

原來DBX4 Driver可以這樣更新

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

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

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

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


整個DBX4專案才這麼大,這樣也出包
怎麼繞呢?就是原本在TSQLQuery下就可以做的調整,現在要移到TClientDataSet下來做才可以。

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


Devart的Dbx driver for MSSQL 就完全沒有問題。讚!



2015/04/21

Delphi DataSnap CORBA C/S 構築方式

MTDORB - Delphi向けCORBA実装

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

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

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

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

參考資料:






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:

  1. Declare FNotifier: IInterface; in the private section.
  2. Add the parameter ANotifier: IInterface; to the Create constructor.
  3. 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,如果你有需要,請再留言索取。

參考資料:

2015/04/17

dbExpress SetSchemaInfo 取得結構的勘誤之處

dbExpress的SetSchemaInfo一直以來都很接近ADO的OpenSchema
連取得的表格格式都很接近。
先來看看TADOConnection.OpenSchema和TSQLConnection.SetSchemaInfo各別取得的表格:
Get Primary Key Schema Information
ADODBX
TABLE_CATALOGRECNO
TABLE_SCHEMACATALOG_NAME
TABLE_NAMESCHEMA_NAME
COLUMN_NAMETABLE_NAME
COLUMN_GUIDINDEX_NAME
COLUMN_PROPIDPKEY_NAME
ORDINALCOLUMN_NAME
PK_NAMECOLUMN_POSITION
INDEX_TYPESORT_ORDERFILTER
表1:ADO參數為"siPrimaryKeys",DBX為stIndexes

看起來一切是如此美好。
但沒想到在dbExpress 4之後,SetSchemaInfo做了一些調整
dbExpress 4下使用SQLConnection.SetSchemaInfo取得的表格居然是:
dbExpress 4: SetSchemaInfo stIndexes
CatalogName
SchemaName
TableName
IndexName
ConstraintName
IsPrimary
IsUnique
IsAscending
表2:DBX 4實際取得的Schema表格

結果COLUMN_NAME被取消了,如此一來,要使用DBX就無法直接使用SetSchemaInfo來取得Primary Key欄位。

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

可參閱:

2015/04/21 更新:

2015/04/07

FireBird測試使用的資料庫

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

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

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

在這邊記錄一下連結:

mirrors for employee.gdb

2015/04/02

Delphi IntraWeb 會計系統程式設計

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

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

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

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

為什麼要使用這本書?

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

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

專案開發環境:

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

整個專案所需要的檔案

IntraWeb 會計系統主畫面

新增子會科程式畫面
與 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程式,開發習慣並沒有因為是網站開發而有所改變。
IW元件功能和VCL元件相比,功能性相對較差,不足的地方還需要額外程式處理,一樣全面使用Delphi Code。
TDataSet存放在Web Server上,這先天的限制使 IW 註定不能承受太大量的使用者負載,但卻能做到很複雜的商業運算。當然也可以不使用TDataSet,這樣就不需使用DB Aware元件,就像不使用DBGrid而使用StringGrid一樣,但相對的,就必須在程式上多費點苦心。
畫面很陽春,和VCL一樣,沒有內建 OS Style 的 IW 畫面實在太復古。

結語:
系統本身雖尚未完成,但初期開發結果能充分使用TDataSet的功能,所以完成整套系統只是時間上的問題,不會有無法做完的情形,何時才能完成?等我空閒一點再說吧。 ^_^

How to use URLEncode in Delphi

URL編碼,也稱【百分號編碼(Percent-encoding)】 由於 URL 不能直接接受 UTF8 文字,所以要先轉成百分號編碼後,如此網址才能順利送給 HTTP Server 從 Indy 加入 Delphi 後,就可以用 IdURI.TIdURI 單元進行編碼 ...