<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # Delphi?XE?10?跨平臺三層數據庫應用教程 前言: ?Delphi XE?開始越來越龐大,比經典的Delphi7難用,但依然是目前所有跨平臺開發工具中開發效率最高、最容易上手的,其快速設計RAD理念是無與倫比的符合人性(什么?是懶惰)。 ?目前網上XE10類似教程很少,而且學習途中遇到一些問題就難以繼續了,經本菜鳥千辛萬苦的求索,特推出Delphi XE 10系列教程。 ?**三層**數據庫應用是目前最簡單、方便、易擴展的架構,而**跨平臺**應用又是所謂的“互聯網+”最需要的,下面的教程分服務器端和客戶端兩大部分完成該設計。 # 一、**Delphi XE10 datasnap服務器設計** ## (1)生成DataSnap服務器的框架 初學者都是呆子,還是用向導吧,主菜單“File”->“New”->“Other…”得到“New Items”向導對話框。見圖一。 ![](https://img2018.cnblogs.com/blog/275839/201810/275839-20181008170515199-727650974.png) 圖一、向導 一般選擇有窗口的Forms程序,如果是正式場合,建議Service程序。見 圖二。 ![](https://img2018.cnblogs.com/blog/275839/201810/275839-20181008170533493-551140298.png) 圖二、選擇應用類型? 如果服務器程序運行在Windows平臺就選“VCLapplication”,如果要跨平臺,還是選“FireMonkeyapplication”,但生成的文件要大一些。見圖三。 ![](https://img2018.cnblogs.com/blog/275839/201810/275839-20181008170608398-2021276590.png) 圖三、選擇應用基本庫源? ?默認TCP/IP為通訊協議,簡單快速,菜鳥專用的Sample Methods用于測試,見圖四。 ![](https://img2018.cnblogs.com/blog/275839/201810/275839-20181008170617665-1859026604.png) 圖四、選擇通訊等參數 ?缺省211端口,別忘了“Test Port”一下更健康,見圖五。 ![](https://img2018.cnblogs.com/blog/275839/201810/275839-20181008170628805-100155271.png) 圖五、測試端口? 不要使用默認的“TComponent”,而用TDSServerModule作為數據服務提供主體,非常方便以后變更為能掙錢的Service應用服務。 ![](https://img2018.cnblogs.com/blog/275839/201810/275839-20181008170637142-539987885.png) 圖六、選擇服務模式 ?Finish這個向導后,硬盤一陣轟鳴,自動生成了工程及其三個主文件,圖七: **ServerContainerUnit1.pas ??放的是網絡服務相關控件,非高手莫入**。 **ServerMehtodsUnit1.pas ? ?就是我們第二步主要的活動場所。** **Unit1.pas ? ?服務器主界面,放個TLabel表示“我是服務器”即可,不必關注。** ![](https://img2018.cnblogs.com/blog/275839/201810/275839-20181008170658440-835167853.png) 圖七、完成框架 ## (2)?數據庫設置 ??進入**ServerMehtodsUnit1.pas?**對應的窗口 ?可用老舊簡單的 BDE或ADO,也可用最新高大上的FireDAC,都XE10了,還是高點吧。 拖入(好吧,當一次C程序員嘲笑的Delphi拖拉員)三個控件即可: **TFDConnection, ?TFDQuery ?**和 ?**TDataSetProvider** 由下圖八可知FireDAC連接邏輯簡單,而且大跨數據庫平臺! ![](https://img2018.cnblogs.com/blog/275839/201810/275839-20181008170705758-1649700837.png) 圖八、數據庫連接構架 **庫驅動連接器: TFDConnection**, 把自帶的SqlLite例子庫復制到當前目錄下備用: C:\\Users\\Public\\Documents\\Embarcadero\\Studio\\17.0\\Samples\\Data\\fddemos.sdb ?右鍵菜單“Connection Editor…”設置并測試,??設置Connected屬性為True,圖九和十。 ![](https://img2018.cnblogs.com/blog/275839/201810/275839-20181008170714276-758354611.png) 圖九、連接器設置入口 ![](https://img2018.cnblogs.com/blog/275839/201810/275839-20181008170735821-1207304985.png) 圖十、連接器設置并檢測 ? **數據集: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; 現在增加一個有用點的: [![復制代碼](https://common.cnblogs.com/images/copycode.gif)](javascript:void(0); "復制代碼") ~~~ function TServerMethods1.ChangeSql(Value:string): Integer; begin FDQuery1.Active := False; FDQuery1.SQL.Text := Value; FDQuery1.Active := True; Result := FDQuery1.RecordCount; end; ~~~ [![復制代碼](https://common.cnblogs.com/images/copycode.gif)](javascript:void(0); "復制代碼") ?最后可在主窗口Form1中加入個Tlabel,設置Text?為“服務中…”表示自己是個服務器,要不然后面客戶端連接不上時,找不到服務器界面。 ## (4)?發布運行 測試通過后即可在prj樹中右鍵Release菜單中選build制作release版本,見圖十一,否則默認都是debug版本。注意win7防火墻彈出阻止時,許可它過外網。 ![](https://img2018.cnblogs.com/blog/275839/201810/275839-20181008170751180-781908420.png) 圖十一、制作發行版 ?經測試xe10下編譯的服務器程序,只需要發布exe和sdb文件即可,無需其他驅動或dll等,并且在win7和winxp下均能正常服務。 # 二、DataSnap的跨平臺客戶端設計 ## (1)?生成客戶端框架 File->New->Muti-Device Application, 圖十二。 ![](https://img2018.cnblogs.com/blog/275839/201810/275839-20181008170800786-149483847.jpg) 圖十二、新建跨平臺程序 選擇第一個空白的吧“BlankAppliction”,?白紙好涂鴉啊! ?**為了邏輯和界面分離,New一個?DataModule**。 ## (2)?設置連接 在DataModule中放入**TSQLConnection**、**TDSPProviderConnection**、**TClientDataSet**和**TDataSource**四個控件,?? ?按照邏輯用DSProviderConnection1就可用連接到服務器了,可Delphi偏偏要用TSQLConnection。選擇置其屬性ConnectionName中自然列出的“DataSnapCONNECTION”,緊臨的屬性Driver值自動變為DataSnap。 TDSPProviderConnection.ServerClassName?為服務器端對應類名TServerMethods1, **接下來只需要?**把TDSPProviderConnection.SqlConnection?連接到TSQLConnection,TClientDataSet.RemoteServer連接到TDSPProviderConnection,即可把他們三個串通一氣。當然TDataSource.DataSet也要連接到TClientDataSet。見圖十三。 ![](https://img2018.cnblogs.com/blog/275839/201810/275839-20181008170811218-271955555.png) 圖十三、設置數據連接路線 **注意:** 現在該是激活他們的時候了:TSQLConnection.Active?設置為True(這時可能會有數據庫口令驗證),TDSPProviderConnection.Connected自動變為True了,**然后在TClientDataSet.ProviderName才能看見傳遞過來的名稱“DataSetProvider1”**,選擇之。最后設置TClientDataSet..Active?為True,沒有錯誤提示才算真正連接好了。 ## (3)?制作界面 制作界面在主窗口unit1里進行。作為數據庫客戶端的基本配置,TBindSourceDB和TGrid組合來代LiveBinding替老Delphi7時代的“數據敏感”,以適應不支持“數據敏感”的OS系統如Android。當然加入一個TBindNavigator能讓你瀏覽數據時更舒服一點,不加也無大礙。見圖十四。 ![](https://img2018.cnblogs.com/blog/275839/201810/275839-20181008170824818-1882474921.png) 圖十四、加入顯示數據控件 TBindSourceDB.DataSet ?和 ?DataSource?必須要 ?uses了datamodule: unit2.pas 后才會自動出現DataModule2.ClientDataSet1 和 ?DataModule2.DataSource1,選擇設置之。 ![](https://img2018.cnblogs.com/blog/275839/201810/275839-20181008171245333-323186137.png) ?--- ![](https://images2018.cnblogs.com/blog/275839/201809/275839-20180909112031357-56980394.png) ?接下來就是要所謂“LiveBinding”了,TBindSourceDB的右鍵菜單上有個“BindVirsully..”從老Delphi7來的人好怕怕哦,沒見過這架勢如圖十五: [![](http://s3.sinaimg.cn/mw690/001BLzizgy720vENDYC62)](http://photo.blog.sina.com.cn/showpic.html#blogid=&url=http://album.sina.com.cn/pic/001BLzizgy720vENDYC62) 圖十五、綁定數據連接 圖十五中藍色箭頭就是我們需要畫出來的。 關閉后回去發現多出一個BindingList1的控件來,而且數據已經輸送過來啦! 圖十六。 ![](https://img2018.cnblogs.com/blog/275839/201810/275839-20181008171453315-1428800170.png) 圖十六、連通數據庫 ?太高興了,趕緊保存并編譯運行,結果大失所望,沒有數據。原來還有很多工作沒有做,如控制連接、生成服務器對應方法等。 **遇到問題與解決:?** **? 1. ? 提示 Cannot change this property when using LiveBindings** ? ?![](https://images2018.cnblogs.com/blog/275839/201809/275839-20180909112825930-102151154.png) **解決方式:** ? ?![](https://images2018.cnblogs.com/blog/275839/201809/275839-20180909113321626-1647058732.png)?? * * * 在unit2的窗口中生成服務器對應方法GenerateDataSnap client classes菜單選擇后,圖十七,自動生成unit3,其中主要是TServerMethods1Client類及其方法,都是服務器上的服務器方法映射到客戶端來的,方便client調用服務,具體代碼不必去看(什么,不求甚解,是腦力不濟)。 ![](https://img2018.cnblogs.com/blog/275839/201810/275839-20181008171509760-932068571.png) 圖十七、自動生成服務方法映射 控制連接:在界面窗口中加入IP和端口(默認為211,是不是想自詡為中國的名牌大學出品) ![](https://img2018.cnblogs.com/blog/275839/201810/275839-20181008171518947-698557958.png) 圖十八、加入控制連接控件 ?“連接”按鈕button1代碼如下: procedure TForm1.Button1Click(Sender:TObject); var ? dm: TServerMethods1Client; //就是上一步自動生成的unit3里的那個映射類 begin????????????????????? //?別忘了uses Unit3, Unit2; ? try ???//連接指定IP和Port的應用服務器 ???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?調試”狀態,見圖十九。 ![](https://img2018.cnblogs.com/blog/275839/201810/275839-20181008171535276-1374397499.png) 圖十九、設置USB連接手機為調試狀態 ?這時候,在Delphi的工具欄右上方自動出現手機型號,見圖二十,此時可以直接點擊運行,約等待1分中,就自動在手機上安裝好了。 ![](https://img2018.cnblogs.com/blog/275839/201810/275839-20181008171546954-1967326846.png) 圖二十、確保Delphi識別連接好的手機型號 ?正式發布手機apk時注意: ? ? ?默認的Release配置會有位置、通話記錄、攝像頭等許多令人不悅的隱私選項,統統的設置為false,見圖二十一,只留一個“Internet”為true(不知到為什么,那就別搞軟件開發了)。 ![](https://img2018.cnblogs.com/blog/275839/201810/275839-20181008171600582-132905291.jpg) 圖二十一、手機隱私權限設置 ? ? 最后build?“Release”版,見圖二十二,在目錄xxx\\client\\Android\\Release\\Project1\\bin下面一個Project1.apk赫然在目,美中不足是大了點約9.5MB。安裝在各種手機上測試吧!見圖二十三。 ![](https://img2018.cnblogs.com/blog/275839/201810/275839-20181008171611577-1382776837.png) 圖二十二、制作手機發行版apk文件 ![](https://img2018.cnblogs.com/blog/275839/201810/275839-20181008171629139-4142503.jpg) 圖二十三、手機上用SQL語句自由訪問服務器 ?在有的手機上安全軟件會提示有廣告插件:a.banner.doubleClick,網上查了下,是google自帶的什么東東,腦力不濟,管不了這么多了。 # 三、總結 本教程完成了Delphi XE 10?下,跨平臺三層數據庫程序例子,其中服務器程序連接數據庫,客戶端程序可以是PC、Android手機,發布僅需要一個exe或apk文件,無需安裝其他驅動、庫,無需設置注冊等惱人的活動。 雖然發布簡單,功能強大,可以從客戶端用SQL語句訪問服務器端任何數據,然而,實際應用還是需要在服務器程序上做復雜的權限控制、流量監控、負載均衡、緩沖池等,不過這些是任何服務器程序都不可回避的,不能怪Delphi吧
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看