1. 程式人生 > >Delphi XE 10 跨平臺三層資料庫應用教程

Delphi XE 10 跨平臺三層資料庫應用教程

Delphi XE 開始越來越龐大,比經典的Delphi7難用,但依然是目前所有跨平臺開發工具中開發效率最高、最容易上手的,其快速設計RAD理念是無與倫比的符合人性(什麼?是懶惰)。

目前網上XE10類似教程很少,而且學習途中遇到一些問題就難以繼續了,經本菜鳥千辛萬苦的求索,特推出Delphi XE 10系列教程。

三層資料庫應用是目前最簡單、方便、易擴充套件的架構,而跨平臺應用又是所謂的“網際網路+”最需要的,下面的教程分伺服器端和客戶端兩大部分完成該設計。

一、Delphi XE10 datasnap伺服器設計

1)生成DataSnap伺服器的框架

初學者都是呆子,還是用嚮導吧,主選單“File

->New->Other…”得到“New Items”嚮導對話方塊。見圖一。

圖一、嚮導

一般選擇有視窗的Forms程式,如果是正式場合,建議Service程式。見 圖二。

圖二、選擇應用型別

如果伺服器程式執行在Windows平臺就選“VCLapplication,如果要跨平臺,還是選“FireMonkeyapplication,但生成的檔案要大一些。見圖三。

圖三、選擇應用基本庫源

預設TCP/IP為通訊協議,簡單快速,菜鳥專用的Sample Methods用於測試,見圖四。

圖四、選擇通訊等引數

預設211埠,別忘了“Test Port

”一下更健康,見圖五。

圖五、測試埠

不要使用預設的“TComponent,而用TDSServerModule作為資料服務提供主體,非常方便以後變更為能掙錢的Service應用服務。

圖六、選擇服務模式

Finish這個嚮導後,硬碟一陣轟鳴,自動生成了工程及其三個主檔案,圖七:

ServerContainerUnit1.pas放的是網路服務相關控制元件,非高手莫入。

ServerMehtodsUnit1.pas就是我們第二步主要的活動場所。

Unit1.pas伺服器主介面,放個TLabel表示“我是伺服器”即可,不必關注。

圖七、完成框架

(2) 資料庫設定

進入

ServerMehtodsUnit1.pas對應的視窗

可用老舊簡單的BDEADO,也可用最新高大上的FireDAC,都XE10了,還是高點吧。

拖入(好吧,當一次C程式設計師嘲笑的Delphi拖拉員)三個控制元件即可:

TFDConnection,TFDQueryTDataSetProvider

由下圖八可知FireDAC連線邏輯簡單,而且大跨資料庫平臺!

圖八、資料庫連線構架

庫驅動聯結器: TFDConnection

把自帶的SqlLite例子庫複製到當前目錄下備用:

C:\Users\Public\Documents\Embarcadero\Studio\17.0\Samples\Data\fddemos.sdb

右鍵選單“Connection Editor…”設定並測試,設定Connected屬性為True,圖九和十。

圖九、聯結器設定入口 圖十、聯結器設定並檢測

資料集:TFDQuery,設定其Connection屬性為剛才測試好的FDConnection1

設定SQL屬性為任意sql語句如:select * from orders, 再令其Active屬性為True

最後拖入TDataSetProvider將資料集對外服務,用其DataSet屬性連線到剛才的FDQurey1

如果不用Connecton Editor.., 可以設定FDConnection1.Params的內容為:

Database=E:\prj\t\server\fddemo.sdb

//若改為 Database=.\fddemo.sdb 則表示db檔案和exe檔案在同一個目錄下

DriverID=SQLite

注意:需要確保sdb檔案存在,否則firedac會直接生成一個空的sdb同名檔案,不報錯,直到執行後客戶端程式訪問才報xxTable does not exist .

最後拖入TDataSetProvider將資料集對外服務,用其DataSet屬性連線到剛才的FDQurey1。

(3) 增加服務內容

嚮導生成的ServerMethord1單元只提供了兩個簡單的服務函式

   function EchoString(Value: string): string;

functionReverseString(Value: string): string;

現在增加一個有用點的:

function TServerMethods1.ChangeSql(Value:string): Integer;

begin

 FDQuery1.Active := False;

 FDQuery1.SQL.Text := Value;

 FDQuery1.Active := True;

 Result := FDQuery1.RecordCount;

end;

最後可在主視窗Form1中加入個Tlabel,設定Text 為“服務中”表示自己是個伺服器,要不然後面客戶端連線不上時,找不到伺服器介面。

(4) 釋出執行

測試通過後即可在prj樹中右鍵Release選單中選build製作release版本,見圖十一,否則預設都是debug版本。注意win7防火牆彈出阻止時,許可它過外網。

圖十一、製作發行版

經測試xe10下編譯的伺服器程式,只需要釋出exesdb檔案即可,無需其他驅動或dll等,並且在win7winxp下均能正常服務。

二、DataSnap的跨平臺客戶端設計

(1) 生成客戶端框架

File->New->Muti-Device Application, 圖十二。

圖十二、新建跨平臺程式

選擇第一個空白的吧“BlankAppliction白紙好塗鴉啊!

為了邏輯和介面分離,New一個DataModule

(2) 設定連線

DataModule中放入TSQLConnectionTDSPProviderConnectionTClientDataSetTDataSource四個控制元件,按照邏輯用DSProviderConnection1就可用連線到伺服器了,可Delphi偏偏要用TSQLConnection。選擇置其屬性ConnectionName中自然列出的“DataSnapCONNECTION”,緊臨的屬性Driver值自動變為DataSnap

TDSPProviderConnection.ServerClassName為伺服器端對應類名TServerMethods1

接下來只需要把TDSPProviderConnection.SqlConnection 連線到TSQLConnectionTClientDataSet.RemoteServer連線到TDSPProviderConnection,即可把他們三個串通一氣。當然TDataSource.DataSet也要連線到TClientDataSet。見圖十三。

圖十三、設定資料連線路線

現在該是啟用他們的時候了:TSQLConnection.Active 設定為True(這時可能會有資料庫口令驗證),TDSPProviderConnection.Connected自動變為True了,然後在TClientDataSet.ProviderName才能看見傳遞過來的名稱“DataSetProvider1”,選擇之。最後設定TClientDataSet..Active True,沒有錯誤提示才算真正連線好了。

(3) 製作介面

製作介面在主視窗unit1裡進行。作為資料庫客戶端的基本配置,TBindSourceDBTGrid組合來代LiveBinding替老Delphi7時代的“資料敏感”,以適應不支援“資料敏感”的OS系統如Android。當然加入一個TBindNavigator能讓你瀏覽資料時更舒服一點,不加也無大礙。見圖十四。

圖十四、加入顯示資料控制元件

TBindSourceDB.DataSetDataSource必須要usesdatamodule: unit2.pas後才會自動出現DataModule2.ClientDataSet1DataModule2.DataSource1,選擇設定之。

接下來就是要所謂“LiveBinding”了,TBindSourceDB的右鍵選單上有個“BindVirsully..”從老Delphi7來的人好怕怕哦,沒見過這架勢如圖十五:

圖十五、繫結資料連線

圖十五中藍色箭頭就是我們需要畫出來的。

關閉後回去發現多出一個BindingList1的控制元件來,而且資料已經輸送過來啦!圖十六。

圖十六、連通資料庫

太高興了,趕緊儲存並編譯執行,結果大失所望,沒有資料。原來還有很多工作沒有做,如控制連線、生成伺服器對應方法等。

unit2的視窗中生成伺服器對應方法GenerateDataSnap client classes選單選擇後,圖十七,自動生成unit3,其中主要是TServerMethods1Client類及其方法,都是伺服器上的伺服器方法對映到客戶端來的,方便client呼叫服務,具體程式碼不必去看(什麼,不求甚解,是腦力不濟)

圖十七、自動生成服務方法對映

控制連線:在介面視窗中加入IP和埠(預設為211,是不是想自詡為中國的名牌大學出品)

圖十八、加入控制連線控制元件

“連線”按鈕button1程式碼如下:

procedure TForm1.Button1Click(Sender:TObject);

var

  dm: TServerMethods1Client; //就是上一步自動生成的unit3裡的那個對映類

begin                      // 別忘了uses Unit3, Unit2;

  try

   //連線指定IPPort的應用伺服器

   DataModule2.SQLConnection1.Close; // DataModule2就是放聯結器那個資料模組

   DataModule2.SQLConnection1.Params.Values['HostName'] := edtIP.Text;

   DataModule2.SQLConnection1.Params.Values['Port'] := edtPort.Text;

   try

     DataModule2.SQLConnection1.Open;

     try

      //建立應用伺服器上的方法在客戶端的實現類即對映方法類

       dm :=TServerMethods1Client.Create(DataModule2.SQLConnection1.DBXConnection);

     //執行伺服器上的方法

       ShowMessage(dm.ReverseString(edtIP.Text)); //系統帶的例子方法

        dm.ChangeSql(edtSql.Text); // 我們在伺服器程式中手工新增的執行sql方法

     finally

       dm.Free;

     end;

           DataModule2.ClientDataSet1.Close;

     DataModule2.ClientDataSet1.Open; //開啟客戶端資料集

   except

     on E: Exception do

       ShowMessage(E.Message);

   end;

 finally

   DataModule2.SQLConnection1.Close;

 end;

end;

注意:如果啟動就連線執行,在win32下正常,在Android上會黑屏。

Win32版在xp上不能正常使用資料庫功能,普通服務方法能用。

(4) 手機除錯和釋出

usb連線上手機,並安裝好手機驅動(如果是華為手機,則安裝華為手機助手),並設定手機為“USB 除錯”狀態,見圖十九。

圖十九、設定USB連線手機為除錯狀態

這時候,在Delphi的工具欄右上方自動出現手機型號,見圖二十,此時可以直接點選執行,約等待1分中,就自動在手機上安裝好了。

圖二十、確保Delphi識別連線好的手機型號

正式釋出手機apk時注意:

預設的Release配置會有位置、通話記錄、攝像頭等許多令人不悅的隱私選項,統統的設定為false,見圖二十一,只留一個“Internet”為true(不知到為什麼,那就別搞軟體開發了)。

圖二十一、手機隱私許可權設定

    最後build Release”版,見圖二十二,在目錄xxx\client\Android\Release\Project1\bin下面一個Project1.apk赫然在目,美中不足是大了點約9.5MB。安裝在各種手機上測試吧!見圖二十三。

圖二十二、製作手機發行版apk檔案 圖二十三、手機上用SQL語句自由訪問伺服器

在有的手機上安全軟體會提示有廣告外掛:a.banner.doubleClick,網上查了下,是google自帶的什麼東東,腦力不濟,管不了這麼多了。

三、總結

本教程完成了Delphi XE 10 下,跨平臺三層資料庫程式例子,其中伺服器程式連線資料庫,客戶端程式可以是PCAndroid手機,釋出僅需要一個exeapk檔案,無需安裝其他驅動、庫,無需設定註冊等惱人的活動。

雖然釋出簡單,功能強大,可以從客戶端用SQL語句訪問伺服器端任何資料,然而,實際應用還是需要在伺服器程式上做複雜的許可權控制、流量監控、負載均衡、緩衝池等,不過這些是任何伺服器程式都不可迴避的,不能怪Delphi吧!