用VFP和SQL SERVER來(lái)做系統(tǒng)的網(wǎng)友越來(lái)越多。怎么從VFP里來(lái)操作或者管理SQL SERVER也成為很多人關(guān)心的問(wèn)題。 對(duì)SQL SERVER的數(shù)據(jù)操作,可以用視圖,SPT或者ADO來(lái)做,但對(duì)服務(wù)器本身的管理,似乎只有用SPT來(lái)發(fā)送一些命令了。其實(shí), 微軟為客戶端操作SQL SERVER開(kāi)發(fā)了一套完整的工具, 這就是SQL - DMO (Distributed Management Objects). 這是一套COM組件,可以在各種語(yǔ)言里使用, VFP里自然也可以用了。
我準(zhǔn)備花點(diǎn)時(shí)間,寫些這方面的介紹文章,然后做個(gè)實(shí)例,算是我通過(guò)MCDBA后,給大家的禮物吧。下面的介紹和例子,是針對(duì)SQL SERVER 2000和VFP7的。
一. 用SQL -DMO的必要性
大部分VFPER開(kāi)發(fā)的程序,都是中小規(guī)模的系統(tǒng),因?yàn)檫@是VFP最適用的范圍。而這樣的系統(tǒng),很多情況下是,客戶端沒(méi)有專業(yè)IT人士維護(hù),更不要說(shuō)專門的DBA了。對(duì)于使用SQL SERVER的系統(tǒng),就帶來(lái)了一些問(wèn)題。 SQL SERVER是一套比較大的數(shù)據(jù)庫(kù)專業(yè)軟件, 是經(jīng)常需要維護(hù)和清理的,而我們這些系統(tǒng)開(kāi)發(fā)者, 總不能老跑去用戶那里做維護(hù)工作吧,尤其對(duì)商業(yè)軟件來(lái)說(shuō),這是很大的成本了。如果可以把對(duì)SQL SERVER的維護(hù)工作放到自己的程序里,甚至把SQL SERVER的安裝無(wú)縫并入到自己的程序的安裝包里,相信大家都會(huì)很樂(lè)意的。 DMO的功能就能滿足我們的這些需要。通過(guò)它,可以從程序里用命令方式來(lái)操作SQL SERVER:停止/啟動(dòng)服務(wù),建立數(shù)據(jù)庫(kù)和表,添加用戶和權(quán)限,備份/恢復(fù)數(shù)據(jù)庫(kù),數(shù)據(jù)導(dǎo)入/導(dǎo)出/發(fā)布... DMO的作用就是把我們能在Enterprise Manager里完成的功能,完全用代碼來(lái)做.
二. 微軟的桌面數(shù)據(jù)引擎 (Desktop Database Engine)
我們都知道SQL SERVER 2000有四個(gè)版本: 個(gè)人版,開(kāi)發(fā)者版,標(biāo)準(zhǔn)班和企業(yè)版. 其實(shí),還有一個(gè)版本,就是桌面數(shù)據(jù)引擎(DDE)。 DDE幾乎具有
SQL SERVER標(biāo)準(zhǔn)版和企業(yè)版的所有功能,不能支持的只是少數(shù)幾個(gè)不常用的功能。而它和其它版本的區(qū)別是, DDE沒(méi)有任何圖形管理界面,沒(méi)有ENTERPRISE MANAGER,沒(méi)有查詢分析器等等工具。 對(duì)它的管理,主要是通過(guò)DMO或者專門的API來(lái)進(jìn)行,它的另一個(gè)優(yōu)點(diǎn)是, 提供了安裝程序,可以直接加到第3方軟件里進(jìn)行安裝。每個(gè)版本的SQL SERVER CD里都帶有DDE, 在MSDE目錄下,運(yùn)行SETUP程序就可以安裝。至于怎么把它加到自己的程序里安裝,大家查一下SQL SERVER的幫助文件就可以找到。
DDE的限制是: 只適宜中小型系統(tǒng)(比如沒(méi)有5個(gè)以上的用戶同時(shí)連接和運(yùn)行大型SQL命令), 如果同時(shí)訪問(wèn)的用戶很多, DDE就會(huì)比正常的SQL SERVER慢了。
這樣, DDE+DMO就可以實(shí)現(xiàn)我們上面所要求的功能了。這種做法甚至可以不讓用戶知道你是在使用SQL SERVER做為數(shù)據(jù)庫(kù)。當(dāng)然, DMO不是只能操作DDE,它可以操作所有版本的SQL SERVER。
三. DMO的安裝
其實(shí)DMO主要就是一個(gè)DLL文件而已: SQLDMO.DLL。具體位置在C:\Program Files\Microsoft SQL Server\80\Tools\Binn目錄里, 在同一目錄里還有個(gè)幫助文件Sqldmo80.hlp. 如果你在程序里不能使用DMO, 找到這個(gè)DLL文件,注冊(cè)一下,就可以了。另外在C:\Program Files\Microsoft SQL Server\80\Tools\ Devtools\Samples\Sqldmo 目錄下,有SQLDMO的例子,但都是VB和VC++的。VB的例子和VFP很接近的.
四. 初步接觸DMO
在這里寫幾個(gè)簡(jiǎn)單的句子,來(lái)看看DMO的強(qiáng)大. 這些命令可以直接在命令窗口里一行一行測(cè)試, 只是用它們來(lái)顯示數(shù)據(jù)庫(kù)的信息。至于添加數(shù)據(jù)庫(kù),數(shù)據(jù)表,備份和恢復(fù)等比較復(fù)雜的功能,得在實(shí)例里做。
oServer=CreateObject("SQLDMO.SQLServer") &&建立SERVER對(duì)象
oServer.Connect("Snoopy","sa","778899") &&連接到你的服務(wù)器
? oServer.Databases.Count &&顯示服務(wù)器上的數(shù)據(jù)庫(kù)總數(shù)
? oServer.Databases.Item(1).Name &&顯示第一個(gè)數(shù)據(jù)庫(kù)的名字
oDB=oServer.Databases("PUBS") &&建立數(shù)據(jù)庫(kù)對(duì)象
? oDB.Tables.Count &&顯示庫(kù)里表的數(shù)目
oTable=oDB.Tables("Titles") &&建立表對(duì)象
? oTable.Rows &&顯示表里的記錄數(shù)
? oTable.Columns.Count &&顯示表的列數(shù)
**顯示列的屬性
? oTable.Columns(1).Name
? oTable.Columns(1).type
? oTable.Columns(1).Datatype
? oTable.Columns(1).Identity
? oTable.Columns(1).IsPrimaryKey
備份和恢復(fù)數(shù)據(jù)庫(kù)
oServer=CreateObject("SQLDMO.SQLServer") &&建立SERVER對(duì)象
oServer.Connect("Snoopy","sa","778899") &&連接到你的服務(wù)器
**備份
oBackup=CreateObject("SQLDMO.Backup") &&建立備份對(duì)象
oBackup.Database="PUBS" &&指定備份數(shù)據(jù)庫(kù)
oBackup.Password="8899" &&給備份文件加密碼
oBackup.Files="D:\Temp\PUBBack.Dat" &&指定目標(biāo)文件
oBackup.SQLBackup(oServer) &&運(yùn)行備份命令,速度很快的
***注: 備份數(shù)據(jù)時(shí)默認(rèn)為追加方式,可以加一句
oBackup.initialize=.T.
這樣就會(huì)覆蓋原來(lái)的文件?;蛘呙看蜝ACKUP時(shí)用不同的文件名,比如把日期作為文件名的一部分.
**備份恢復(fù)
oRestore=CreateObject("SQLDMO.Restore")
oRestore.Database="PUBS"
oRestore.Files="D:\Temp\PUBBack.Dat"
oRestore.SQLRestore(oServer) &&先試不加密碼,備份失敗
oRestore.Password="8899"
oRestore.SQLRestore(oServer)
SQL SERVER提供幾種數(shù)據(jù)庫(kù)備份方式,
一種是完整備份 (Full Backup), 第二種是差異備份(Differential Backup), 第三種是日志備份, 第四種是文件備份
完整備份是把整個(gè)數(shù)據(jù)庫(kù)做個(gè)備份,差異備份只是備份進(jìn)行了完整備份后數(shù)據(jù)庫(kù)里的新變化。當(dāng)數(shù)據(jù)庫(kù)很大時(shí), 完整備份很費(fèi)空間和時(shí)間,可以根據(jù)情況定期做,比如每周或者每月做一次完整備份。 其它時(shí)間可以進(jìn)行差異備份,比如每天一次,或者半天一次, 也可以結(jié)合進(jìn)行日志備份。文件備份是直接備份數(shù)據(jù)庫(kù)的數(shù)據(jù)和日志文件。和在操作系統(tǒng)里做備份一樣.
在恢復(fù)的時(shí)候,只要先恢復(fù)完整備份,然后恢復(fù)最后一個(gè)差異備份就可以。如果有日志備份,還需要恢復(fù)差異備份后所做的日志備份。
備份種類通過(guò) 備份對(duì)象的Action屬性來(lái)決定.
oBackup.Action=0 && 參數(shù): 0 - 完整備份,1- 差異備份, 2- 文件備份, 3 -日志備份
我準(zhǔn)備花點(diǎn)時(shí)間,寫些這方面的介紹文章,然后做個(gè)實(shí)例,算是我通過(guò)MCDBA后,給大家的禮物吧。下面的介紹和例子,是針對(duì)SQL SERVER 2000和VFP7的。
一. 用SQL -DMO的必要性
大部分VFPER開(kāi)發(fā)的程序,都是中小規(guī)模的系統(tǒng),因?yàn)檫@是VFP最適用的范圍。而這樣的系統(tǒng),很多情況下是,客戶端沒(méi)有專業(yè)IT人士維護(hù),更不要說(shuō)專門的DBA了。對(duì)于使用SQL SERVER的系統(tǒng),就帶來(lái)了一些問(wèn)題。 SQL SERVER是一套比較大的數(shù)據(jù)庫(kù)專業(yè)軟件, 是經(jīng)常需要維護(hù)和清理的,而我們這些系統(tǒng)開(kāi)發(fā)者, 總不能老跑去用戶那里做維護(hù)工作吧,尤其對(duì)商業(yè)軟件來(lái)說(shuō),這是很大的成本了。如果可以把對(duì)SQL SERVER的維護(hù)工作放到自己的程序里,甚至把SQL SERVER的安裝無(wú)縫并入到自己的程序的安裝包里,相信大家都會(huì)很樂(lè)意的。 DMO的功能就能滿足我們的這些需要。通過(guò)它,可以從程序里用命令方式來(lái)操作SQL SERVER:停止/啟動(dòng)服務(wù),建立數(shù)據(jù)庫(kù)和表,添加用戶和權(quán)限,備份/恢復(fù)數(shù)據(jù)庫(kù),數(shù)據(jù)導(dǎo)入/導(dǎo)出/發(fā)布... DMO的作用就是把我們能在Enterprise Manager里完成的功能,完全用代碼來(lái)做.
二. 微軟的桌面數(shù)據(jù)引擎 (Desktop Database Engine)
我們都知道SQL SERVER 2000有四個(gè)版本: 個(gè)人版,開(kāi)發(fā)者版,標(biāo)準(zhǔn)班和企業(yè)版. 其實(shí),還有一個(gè)版本,就是桌面數(shù)據(jù)引擎(DDE)。 DDE幾乎具有
SQL SERVER標(biāo)準(zhǔn)版和企業(yè)版的所有功能,不能支持的只是少數(shù)幾個(gè)不常用的功能。而它和其它版本的區(qū)別是, DDE沒(méi)有任何圖形管理界面,沒(méi)有ENTERPRISE MANAGER,沒(méi)有查詢分析器等等工具。 對(duì)它的管理,主要是通過(guò)DMO或者專門的API來(lái)進(jìn)行,它的另一個(gè)優(yōu)點(diǎn)是, 提供了安裝程序,可以直接加到第3方軟件里進(jìn)行安裝。每個(gè)版本的SQL SERVER CD里都帶有DDE, 在MSDE目錄下,運(yùn)行SETUP程序就可以安裝。至于怎么把它加到自己的程序里安裝,大家查一下SQL SERVER的幫助文件就可以找到。
DDE的限制是: 只適宜中小型系統(tǒng)(比如沒(méi)有5個(gè)以上的用戶同時(shí)連接和運(yùn)行大型SQL命令), 如果同時(shí)訪問(wèn)的用戶很多, DDE就會(huì)比正常的SQL SERVER慢了。
這樣, DDE+DMO就可以實(shí)現(xiàn)我們上面所要求的功能了。這種做法甚至可以不讓用戶知道你是在使用SQL SERVER做為數(shù)據(jù)庫(kù)。當(dāng)然, DMO不是只能操作DDE,它可以操作所有版本的SQL SERVER。
三. DMO的安裝
其實(shí)DMO主要就是一個(gè)DLL文件而已: SQLDMO.DLL。具體位置在C:\Program Files\Microsoft SQL Server\80\Tools\Binn目錄里, 在同一目錄里還有個(gè)幫助文件Sqldmo80.hlp. 如果你在程序里不能使用DMO, 找到這個(gè)DLL文件,注冊(cè)一下,就可以了。另外在C:\Program Files\Microsoft SQL Server\80\Tools\ Devtools\Samples\Sqldmo 目錄下,有SQLDMO的例子,但都是VB和VC++的。VB的例子和VFP很接近的.
四. 初步接觸DMO
在這里寫幾個(gè)簡(jiǎn)單的句子,來(lái)看看DMO的強(qiáng)大. 這些命令可以直接在命令窗口里一行一行測(cè)試, 只是用它們來(lái)顯示數(shù)據(jù)庫(kù)的信息。至于添加數(shù)據(jù)庫(kù),數(shù)據(jù)表,備份和恢復(fù)等比較復(fù)雜的功能,得在實(shí)例里做。
oServer=CreateObject("SQLDMO.SQLServer") &&建立SERVER對(duì)象
oServer.Connect("Snoopy","sa","778899") &&連接到你的服務(wù)器
? oServer.Databases.Count &&顯示服務(wù)器上的數(shù)據(jù)庫(kù)總數(shù)
? oServer.Databases.Item(1).Name &&顯示第一個(gè)數(shù)據(jù)庫(kù)的名字
oDB=oServer.Databases("PUBS") &&建立數(shù)據(jù)庫(kù)對(duì)象
? oDB.Tables.Count &&顯示庫(kù)里表的數(shù)目
oTable=oDB.Tables("Titles") &&建立表對(duì)象
? oTable.Rows &&顯示表里的記錄數(shù)
? oTable.Columns.Count &&顯示表的列數(shù)
**顯示列的屬性
? oTable.Columns(1).Name
? oTable.Columns(1).type
? oTable.Columns(1).Datatype
? oTable.Columns(1).Identity
? oTable.Columns(1).IsPrimaryKey
備份和恢復(fù)數(shù)據(jù)庫(kù)
oServer=CreateObject("SQLDMO.SQLServer") &&建立SERVER對(duì)象
oServer.Connect("Snoopy","sa","778899") &&連接到你的服務(wù)器
**備份
oBackup=CreateObject("SQLDMO.Backup") &&建立備份對(duì)象
oBackup.Database="PUBS" &&指定備份數(shù)據(jù)庫(kù)
oBackup.Password="8899" &&給備份文件加密碼
oBackup.Files="D:\Temp\PUBBack.Dat" &&指定目標(biāo)文件
oBackup.SQLBackup(oServer) &&運(yùn)行備份命令,速度很快的
***注: 備份數(shù)據(jù)時(shí)默認(rèn)為追加方式,可以加一句
oBackup.initialize=.T.
這樣就會(huì)覆蓋原來(lái)的文件?;蛘呙看蜝ACKUP時(shí)用不同的文件名,比如把日期作為文件名的一部分.
**備份恢復(fù)
oRestore=CreateObject("SQLDMO.Restore")
oRestore.Database="PUBS"
oRestore.Files="D:\Temp\PUBBack.Dat"
oRestore.SQLRestore(oServer) &&先試不加密碼,備份失敗
oRestore.Password="8899"
oRestore.SQLRestore(oServer)
SQL SERVER提供幾種數(shù)據(jù)庫(kù)備份方式,
一種是完整備份 (Full Backup), 第二種是差異備份(Differential Backup), 第三種是日志備份, 第四種是文件備份
完整備份是把整個(gè)數(shù)據(jù)庫(kù)做個(gè)備份,差異備份只是備份進(jìn)行了完整備份后數(shù)據(jù)庫(kù)里的新變化。當(dāng)數(shù)據(jù)庫(kù)很大時(shí), 完整備份很費(fèi)空間和時(shí)間,可以根據(jù)情況定期做,比如每周或者每月做一次完整備份。 其它時(shí)間可以進(jìn)行差異備份,比如每天一次,或者半天一次, 也可以結(jié)合進(jìn)行日志備份。文件備份是直接備份數(shù)據(jù)庫(kù)的數(shù)據(jù)和日志文件。和在操作系統(tǒng)里做備份一樣.
在恢復(fù)的時(shí)候,只要先恢復(fù)完整備份,然后恢復(fù)最后一個(gè)差異備份就可以。如果有日志備份,還需要恢復(fù)差異備份后所做的日志備份。
備份種類通過(guò) 備份對(duì)象的Action屬性來(lái)決定.
oBackup.Action=0 && 參數(shù): 0 - 完整備份,1- 差異備份, 2- 文件備份, 3 -日志備份