翻譯|使用教程|編輯:黃竹雯|2019-03-27 16:31:43.000|閱讀 797 次
概述:數(shù)據(jù)庫應(yīng)用程序使用SQL語句操作數(shù)據(jù)。除非用戶直接輸入,否則語句可以采用兩種方式構(gòu)建,在開發(fā)期間進(jìn)行硬編碼,或在運(yùn)行時(shí)構(gòu)建。第一種方式對(duì)開發(fā)人員來說非常方便,而第二種方式則更靈活。UniDAC可以結(jié)合這兩種方法,從而達(dá)到最佳效果:你可以對(duì)在運(yùn)行時(shí)轉(zhuǎn)換為適當(dāng)語法的SQL語句進(jìn)行硬編碼。
# 界面/圖表報(bào)表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關(guān)鏈接:
Universal Data Access Components (UniDAC)是一款通用數(shù)據(jù)庫訪問組件,提供了多個(gè)數(shù)據(jù)庫的直接訪問,如針對(duì)Windows的Delphi,C++Builder, Lazarus (以及 Free Pascal), Mac OS X, iOS,Android,Linux和64和32位的FreeBSD等等。我們將長(zhǎng)期的經(jīng)驗(yàn)集于這個(gè)小組件,提供統(tǒng)一的數(shù)據(jù)庫連接訪問(如oracle、微軟SQL等等)。這意味著你可以在你的項(xiàng)目之間輕松地切換不同的數(shù)據(jù)庫,以及創(chuàng)建跨數(shù)據(jù)庫應(yīng)用程序接口。
在幾個(gè)數(shù)據(jù)庫的編程應(yīng)用程序中最關(guān)鍵的問題之一是SQL語法在許多情況下可能不同。本文將演示UniDAC如何幫助大家解決此問題。
數(shù)據(jù)庫應(yīng)用程序使用SQL語句操作數(shù)據(jù)。除非用戶直接輸入,否則語句可以采用兩種方式構(gòu)建,在開發(fā)期間進(jìn)行硬編碼,或在運(yùn)行時(shí)構(gòu)建。第一種方式對(duì)開發(fā)人員來說非常方便,而第二種方式則更靈活。UniDAC可以結(jié)合這兩種方法,從而達(dá)到最佳效果:你可以對(duì)在運(yùn)行時(shí)轉(zhuǎn)換為適當(dāng)語法的SQL語句進(jìn)行硬編碼。
本篇文章主要包含以下內(nèi)容:
UniDAC的通用功能基于以下功能:
了解這一點(diǎn)后,你可以編寫在運(yùn)行時(shí)真正與數(shù)據(jù)庫無關(guān)的SQL代碼。
UniDAC提供了兩種處理宏的方法:Connection Macros(連接宏)和 DataSet Macros(數(shù)據(jù)集宏)。它們的定義方式和SQL查詢文本中的指示方式不同。
DataSet Macros由“&MacroName”定義,僅影響指定的數(shù)據(jù)集。
Connection Macros由“{MacroName}”定義,并影響所有關(guān)聯(lián)的數(shù)據(jù)集。
讓我們對(duì)TUniConnection.Macros進(jìn)行更詳細(xì)的分析。以傳統(tǒng)方式使用它:
if UniConnection.ProviderName = 'Oracle' then UniConnection.MacroByName('tablename').Value := 'dept' else if UniConnection.ProviderName = 'MySql' then UniConnection.MacroByName('tablename').Value := 'test.dept';
或者你可以使用預(yù)定義的方法。宏是一組名稱,條件和值。如果啟用了潛在條件,宏將計(jì)算其值,如果未啟用條件,則計(jì)算為空字符串。根據(jù)TUniConnection組件使用的提供程序啟用或禁用條件。例如,如果使用Oracle提供程序,則將啟用ORACLE宏。
因此,基于Oracle條件的所有宏在SQL語句中使用時(shí)都會(huì)返回它們的值;所有其他宏返回空字符串。有關(guān)可用條件的列表(或者說,預(yù)定義的宏),請(qǐng)參閱“宏參考”(“宏參考”將會(huì)在后續(xù)文章中與大家分享)。
從API的角度來看,宏表示為TUniMacro類。宏的集合被組織成TUniMacros,可以通過TUniConnection的宏屬性訪問它。每個(gè)連接都有一組獨(dú)立的宏。
以下示例演示了宏的用法:
UniConnection.Provider = 'MySQL'; ... UniConnection.Open; UniConnection.Macros.Add('tablename', 'test.dept', 'MySQL'); UniQuery.SQL.Text := 'SELECT Count(*) FROM {tablename}'; UniQuery.Open;
現(xiàn)在假設(shè)我們需要在Oracle服務(wù)器上執(zhí)行相同的操作。 由于使用了UniSQL,唯一要添加的是另一個(gè)宏:
UniConnection.Provider = 'Oracle'; ... UniConnection.Open; UniConnection.Macros.Add('tablename', 'test.dept', 'MySQL'); UniConnection.Macros.Add('tablename', 'dept', 'Oracle'); UniQuery.SQL.Text := 'SELECT Count(*) FROM {tablename}'; UniQuery.Open;
如你所見,控制SQL語句轉(zhuǎn)換非常容易。現(xiàn)在讓我們看一下演示一大堆重要功能的另一個(gè)示例:
UniConnection.Macros.Add('tablename', 'emp', ''); //For MySQL, prepend database name UniConnection.Macros.Add('tablename', 'test.emp', 'MySQL'); //Limit records count where it is easy (MySQL and PostgreSQL) UniConnection.Macros.Add('limit', 'LIMIT 0,5', 'MySQL'); UniConnection.Macros.Add('limit', 'LIMIT 5 OFFSET 0', 'PostgreSQL'); //Define default FROM clause UniConnection.Macros.Add('from', 'FROM {tablename}', ''); //If the limit macro is defined, add extra clause UniConnection.Macros.Add('from', 'FROM {tablename} {limit}', 'limit'); //Define query that uses the macro UniQuery.SQL.Text := 'SELECT EName, Job, Sal {from}'; UniQuery.Open;
假設(shè)在此示例中連接到MySQL服務(wù)器,執(zhí)行的語句將是:
注意:你可以使用DBMonitor應(yīng)用程序查看執(zhí)行時(shí)查詢的內(nèi)容。對(duì)樣本的逐步分析揭示了以下重要說明:
你可以在大括號(hào)內(nèi)的宏名稱后添加任何文本。如果啟用了宏的條件,則將此文本添加到最終的SQL語句中。例如:
UniConnection.Macros.Add('schema', 'test', 'MySQL'); UniQuery.SQL.Text := 'SELECT * FROM {schema .}emp'; UniQuery.Open;
在此示例中,僅在啟用SCHEMA宏時(shí)才添加點(diǎn)。UniDAC提供了一組有用的預(yù)定義宏,可以幫助你編寫通用語句。有關(guān)更多信息,請(qǐng)參閱“宏參考”(“宏參考”將會(huì)在后續(xù)文章中與大家分享)。
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請(qǐng)務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請(qǐng)郵件反饋至chenjj@fc6vip.cn