所謂三層:
(1) 客戶端
(2) 服務器端
(3) 數據庫
在數據訪問時,使得客戶端必須通過服務器來訪問數據庫。提高了系統的安全性。
在Delphi中可以使用Socket或者Dcom來連接他們相互間的通訊。如果使用Scocket在系統使用時必須提供Scocket連接器,而Dcom則不用。客戶端和服務器的連接需要Broker來聯系。
環境為winxp sp2 + delphi 7 + db7.(MSSQL2000)
創建過程:
1、選擇"Multitier"--"Remote data module"。在跳出來的對話框裡面輸入名稱(任意),例如:AppSqlConn。選擇確定,進入remote data module窗口。
2、加入組件:adodataset,點擊connectionstring屬性,點擊後面的…,進入設定連接窗口。選擇:use connection string--build,在提供程序中選擇:"Microsoft ole db provider for sql server",在連接中:服務器名稱輸入sql server的ip地址,登錄信息中輸入用戶名和密碼(sql server),在選擇數據庫中選擇自己想要使用的數據庫。一般只要地址正確、用戶名和密碼無誤,肯定可以連接通過。確定退出。
3、在commandtext中點擊後面的…,進入sql 語句設定,根據自己的要求設定。
4、將active屬性設置為true。只要前面的設定是正確的,這裡應該順利通過。
5、加入組件:datasetprovider。設定其dataset屬性為上面的adodataset。
6、到此服務器端已經設置完成。請保存並且運行一次,從而使服務注冊。
7、運行delphi的bin目錄下面的scktsrvr,因為下面要使用socket連接。運行後任務欄中出現socket server的圖標。
8、新建程序(application),然後file--new--data module,會創建客戶端的data module。
9、加入組件:socketconnection,在address中輸入sql server的ip地址,然後在servername中輸入剛才創建的remote data module的服務程序。程序會自動在serverguid中加入id。然後選擇connected屬性為true。只要此處不報告錯誤,此程序基本成功了。
10、加入組件:clientdataset,選擇remoteserver屬性為socketconnection,選擇providename為服務器程序的datasetprovider。然後選擇active屬性為true。
11、到程序的form窗口狀態,首先選擇file--use unit,選擇上面創建的data module,確定。然後加入組件datasource和dbgrid。選擇datasourece的dataset屬性為data module的clientdataset,選擇dbgrid的datasource為這裡的datasource組件。現在應該可以看到dbgrid的窗口中出現了想要的數據。保存並且編譯客戶端程序。
12、客戶端分發軟件設定。從服務器端拷貝midas.dll文件到本機的system(98)或者system32(2000),一般自己就可以注冊,否則用regsvr32 midas.dll注冊一下。然後將剛才客戶端程序拷貝過來運行一下,應該可以正常運行。
還有拒絕訪問的錯誤我也碰到過,是沒有打開borland socket server,該程序是borland/bin/scktsrvr.exe
注冊服務器端時應該使用 run-install mts objects安裝到組件服務裡,安裝完後可以在
控制面板-組件服務裡找到服務器的GUID,然後填到borland socket server裡就可以了。
scktsrvr.exe是一個NT的服務程序,你用scktsrvr.exe -install安裝之後,每次系統啟動,它都會自動運行的。如果你的客戶端用了socketconnection,每次連接應用服務器的時候,都需要通過scktsrvr.exe才能訪問到你的應用服務器.
scktsrvr.exe -uninstall 即可卸載
midas.dll是個什麼文件?
1.數據庫三層的文件.
2.TClientDataSet小家碧玉,恐怕人人都喜歡使用。但是,都知道娶TClientDataSet是有代價的,因為你同時也得面對丈母娘MIDAS.DLL。
3.delphi用來設計多層應用程序的動態庫,用來作客戶端和服務器連接和處理。
4. Multi-tier distributed application service
多層分布式開發服務
midas.dll是它運行時需要的動態連接庫。
5.你安裝好delphi時裝在system32裡的,delphi的一個DLL.
能不能使用TClientDataSet又不用MIDAS.DLL呢?
很簡單,就是uses一下MidasLib單元!
MidasLib單元在Delphi6中才有,是Lib目錄下的一個dcu文件。一旦在你的源程序中引用了MidasLib單元,程序運行時就不再需要MIDAS.DLL文件。
然而,編譯後程序大小一定會增加200k以上,即使使用包編譯模式。
============================================================
在使用DataModel窗體存放數據庫控件的程序中,應注意:
1、如果在其他窗體中調用DataModel中的控件必須在先引用Datemodel的單元,在implementation下面加入以下語句
uses
DataModel的單元名稱;
2、必須改變窗體的創建順序,datamodel窗體必須先於引用該窗體控件的窗體創建
三層結構
應用層:
一、需要三個數據控件:
Adoconnect
AdoQuery
DataSetProvider
二、聯接順序:
SQL數據庫<--Adoconnect<--Adoquery<--DataSetProvider
三、屬性設置:
Adoconnect: 1、ConnectionString
2、Connected
Adoquery: 1、connection
//2、Active
DataSetProvider: 1、DataSet
2、option.poAllowCommand:=true
四、其他
1、運行SocketServer並開端口
2、數據模塊使用遠程數據模塊
客戶端:
一、基本控件
SocketConnection
ClientDataSet
DataSoure
DBGrid
二、聯接順序:
應用層<--SocketConnection<--ClientDataSet<--DataSoure<--DBGrid
三、屬性設置:
SocketConnection: 1、Adrress
2、ServerName
3、Port
4、connected
ClientDataSet: 1、RemoteServer
2、CommandText
3、ProviderName
4、Active
DataSoure: 1、DataSet
DBGrid: 1、DataSoure
四、其他
一、先關閉記錄集後執數據庫操作語句
rs.close
sqlstr="insert into abc(a,b,c) values("a","b","c")"
rs.open sqlstr,conn
rs.update
rs.colose
二、在可能發生出錯的數據庫操作做錯誤捕捉,如:open,update,delete等
rs.close
sqlstr="insert into abc(a,b,c) values("a","b","c")"
on error resume next
rs.open sqlstr,conn
if err then
msgbox(err.Description)
msgbox(cstr(err.number))
rs.update
rs.colose