Translate

2016/02/05

那些年 DBeXpress 所教我的事:DBXCommon 單元

今天是臺灣農曆年的最後一個工作日,也用技術文章作最後的收尾吧!
==============================


資料庫應用程式設計一直以來都是 Delphi 的強項之一。

Dbx 的目標是為了要讓所有資料庫存取方式統一,在核心上用了很多技巧。

在【dbExpress MetaData 徹底攻略】 文中便大量的應用到 DBX 的獨特設計方法。

例如:【如何取得資料表的所有欄位?】


SQL Server:
  select COLUMN_NAME from 
  INFORMATION_SCHEMA.COLUMNS 
  where TABLE_NAME = '大匠之風'


Firebird:
select rdb$field_name from rdb$relation_fields
where rdb$relation_name='大匠之風';

如果每一套資料庫都寫一份這樣的指令,你可能會這樣寫:

{$IFDEF 'M$SQL'}
{$ENDIF}
{$IFDEF 'FIREBIRD'}
{$ENDIF}

這看起來有點笨,那麼,DBX 會怎麼寫呢?

procedure TMainForm.Button2Click(Sender: TObject);
var
  Cmd: TDBXCommand;
  R: TDBXReader;
begin
  DBCon.Open;
  Cmd := DBCon.DBXConnection.CreateCommand;
  Cmd.CommandType := TDBXCommandTypes.DbxMetaData;
  Cmd.Text := 'GetColumns 大匠之風';
  R := Cmd.ExecuteQuery;
  while R.Next do
  begin
    Memo1.Lines.Add(R.Value['ColumnName'].AsString);
  end;
  R.Free;
  Cmd.Free;
end;

不管換了哪一家的資料庫,只要使用 DBX,一招吃遍天下!

其中,為了要活用 DBX 細節的設定,DBXCommon 單元在背後發揮很大的參考功能,以 Data.DBXCommon.TDBXMetaDataCommands 類別和它的成員為例:

TDBXMetaDataCommands=class
      const
        ...
        GetColumns= 'GetColumns';
        ...
    end;// TDBXMetaDataCommands

我們可以發現定義的內容全都是常數字串,如此一來便完成 DBX MetaData 的資料字典,一來也不怕名字打錯,二來也方便後續的除錯。

所以我們也可以這樣寫:
procedure TMainForm.Button2Click(Sender: TObject);
var
  Cmd: TDBXCommand;
  R: TDBXReader;
begin
  DBCon.Open;
  Cmd := DBCon.DBXConnection.CreateCommand;
  Cmd.CommandType := TDBXCommandTypes.DbxMetaData;
  Cmd.Text := TDBXMetaDataCommands.GetColumns + ' 大匠之風';
  R := Cmd.ExecuteQuery;
  while R.Next do
  begin
    Memo1.Lines.Add(R.Value[TDBXColumnsColumns.ColumnName].AsString);
  end;
  R.Free;
  Cmd.Free;
end;


資料字典的設計方法值得學習,這也是 Dbexpress 所要告訴你的小秘密

噓!別說出去了哦! 圖片來源

新年快樂!

沒有留言:

張貼留言

Why I Choose Delphi! (CHT)

扣除使用 C++ Builder 的時間,我實際使用 Delphi 的時間點是 2012 年,它帶我看到了不一樣的世界,見識到世界各地的高手使用 Delphi 創造出他們引以為豪的產品,並且無私的分享他們的學習知識,使我的技術能力得以跟隨他們的能力提升。 最最讓我喜歡的...