亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Delphi > 正文

用Delphi對SQL-DMO進行封裝的一種實現

2019-11-18 18:17:05
字體:
來源:轉載
供稿:網友

SQL-DMO簡介

Microsoft SQL Server是當前比較流行的數據庫管理系統。隨著SQL Server的不斷完善與發展,以及與微軟本身的Windows系列操作系統的完美結合,在Windows平臺上提供較好的性能和易用性,因此越來越受到人們的重視。
SQL-DMO的全稱是SQL Distributed Management Objects。它是一個集合,包含一組有雙重接口的COM。通過SQL-DMO我們可以控制操作SQL Server 的數據庫引擎和復制管理。由于SQL-DMO是一組COM,所以任何可以使用COM的開發工具都可以使用它,包括VB、Delphi、VC、BCB、asp等等幾乎包括所有的Windows平臺下的開發工具。

SQL-DMO用途

我們為什么需要使用SQL-DMO對數據庫進行管理呢?難道我們用EnterPRise Manager和T-SQL 腳本對數據庫進行管理還不夠嗎?
用SQL-DMO可以進行靈活、可定制、高效的數據庫管理活動。由于SQL-DMO提供的是SQL SERVER的管理接口,通過編程,你就可以按照自己的需求,定制管理活動。舉個例子,如果我們管理的是一個大型組織,里面有很多個SQL Server實例。現在要給組織中所有的SQL Server實例添加一個用戶,若通過Enterprise Manager手工給每個SQL Server實例進行添加用戶話就是一個費時費力而且容易出現人為錯誤的操作,若使用SQL-DMO編程實現話,用一個循環操作就可以簡單高效的完成。
在作者看來,更為重要的是:使用SQL-DMO可以管理MSDE(Microsoft SQL Server Desktop Engine)。MS SQL SERVER價格昂貴,而MSDE是免費的。在一些中小型應用中,MSDE已經足夠。但是,由于MSDE只提供數據庫引擎不提供可視化的管理界面,無法對MSDE中的數據庫進行常規管理,限制了MSDE的適用范圍。此時如果我們使用SQL-DMO就可以提供自己的數據庫管理界面,這樣就能對MSDE中的數據庫進行一定的常規管理。如果不考慮時間和成本的話,完全可以做出一個功能類似于Enterprise Manager的管理界面。實際上Enterprise Manager的絕大部分功能也是通過使用SQL-DMO實現的。(其中用到SQL-NS(SQL-Namespace,其也是一個Com對象集合,提供了對SQL Server內對象名字空間的訪問功能),但是SQL-NS本身也是架構在SQL-DMO之上的)

SQL-DMO宿主和構成

SQL-DMO的宿主是SQLDMO.DLL,位于X:/Program Files/Microsoft SQL Server/80/Tools/Binn下。另外它還需要以下一些文件:
l       SQLDMO.DLL (主類型庫)
l       SQLDMO.RLL (語言資源文件)
l       SQLSVC.DLL (數據庫管理用類型庫)
l       SQLSVC.RLL (語言資源文件)
l       SQLUNIRL.DLL (Unicode 重定向層)
l       SQLRSLD.DLL (資源載入用)
l       ODBC (包括ODBC32.DLL, SQLSRV32.DLL, ODBCBCP.DLL 等等)
這里是一個調用結構的說明(圖1):

ODBC32.DLL
SQLSVC.DLL
SQLRSLD.DLL
SQLDMO.RLL
SQLSVC.RLL
我們的應用在這里創建使用SQL-DMO對象
SQL Server
網絡邊界
SQLDMO.DLL
                                 圖1   SQL-DMO的調用結構

SQL-DMO的對象樹

我們首先來看一下SQL-DMO龐大復雜的對象樹(見圖3):
SQLServer對象是這個對象樹的主干,這個主干下主要有三個大的分支:
l         Database分支,其下的一系列的對象實現了SQLServer中數據庫架構以及維護任務。
l         JobServer分支,其下的一系列對象實現了SQL Server代理( Agent)服務。
l         Replication分支,其下的一系列的作對象實現了SQL Server的復制服務。
還需要說明的有:
l         對象樹沒有列出Application對象,其實這是一個比較重要的對象。任何一個SQL-DMO對象都有一個屬性指向Application對象。Application對象代表著一個全局的應用,其包含了Servers和ServerGroups兩個集合對象。如圖2:
圖2   Application對象
l         對象樹僅僅表示了SQL-DMO的結構并沒有列出所有的對象,例如NameList對象、Servergroup對象等。
SQL-DMO對象樹結構復雜,對象繁多,在這里不可能對每個對象每個屬性每個方法一一加以介紹說明,一些方法的說明會在下面具體的代碼中解釋。
                                  圖3     SQL-DMO的對象樹

Delphi封裝SQL-DMO的實現

    下面就介紹筆者利用Delphi實現的對SQL-DMO封裝的組件TDBCTRL。
筆者由于在某個項目中需要一個免費的數據庫引擎,最終選擇了MSDE,但是MSDE沒有管理界面,僅僅是個引擎而已。所以就有了給MSDE提供簡單明了的管理界面這個需求。我們不需要提供Enterprise Manager那么多的管理功能,我們只需要提供最常用的功能就足夠了??紤]到易使用性和可擴展性,決定用組件的形式提供。實現的組件提供了對SQL-DMO的一層包裝,把一些常用的功能進行封裝,簡化使用。
注意,編譯此組件需要引入SQL-DMO的類型庫,并生成對應的描述代碼。代碼當中的包含很多Delphi對Com對象的一些常規用法和慣用表示法。在這里不討論Delphi是如何使用COM了,讀者可以參考相關書籍。
此組件包含如下屬性:
property Host:String  read FHost write FHost;
//主機名、即所要連接的SQL Server實例名
    property PassWord:String  read FPWD write FPWD; 
   //用于連接的用戶密碼
     property Login:String read FLogin write FLogin;
    //用于連接的用戶名
    property LoginSecure:boolean read FLoginSecure write FLoginSecure;
    //登錄模式、True代表使用NT驗證模式,false代表SQL Sever驗證模式
    另外此組件聚合了一個SqlServer對象,用有一個私有數據成員:sqlserver來保存。其類型為_SqlServr.
此組件的構造函數和析構函數也十分簡單。構造函數就是連接創建sqlserver對象。析構函數也僅僅是完成對sqlserver對象的析構。
constructor TDBCTRL.Create(AOwner: TComponent);
begin
  inherited;
  sqlserver:=coSqlserver.Create;   //CoSqlserver是_SqlServer的類工廠
end;
destructor TDBCTRL.Destroy;
begin
  sqlserver:=nil;    //把此對象設置為nil后,Delphi會在幕后完成Com對象的析構。
  inherited;
end;
如果我們要對某個SQL Server實例進行管理和操作,首先我們要連接到這個實例。下面的ConnectToServer函數就實現了如何連接到一個SQL Server實例的功能。
function TDBCTRL.ConnectToServer: Boolean;
begin
  SqlServer.LoginSecure:= FLoginSecure;
// 設置是否是NT驗證模式,如果是True就會忽略Login和Password;
  try
     sqlServer.Connect(FHost,FLogin,FPWD); 
  Result:=True;
  Except
   On E:EOleException do
     begin
       ShowMessage(e.Message);
       result:=false;
     end;
  end;
end;
連接完成后,就取得了對此實例的控制(根據所登錄的用戶,會有不同的控制權限)。下面列出的一些方法展示了一些功能。
GetTableList方法取得某個數據庫的所有的表名,放在一個TStringList中返回。
function TDBCTRL.GetTableList(DBName: String;
  var TableList: TStringList): Boolean;
var
  NowDB:_DataBase;  //數據庫
  NowTable:_Table;    //表
  I:integer;
begin
  try
    TableList.Clear ;   //清空StringList
    NowDB:=SqlServer.Databases.Item(DBName,Sqlserver);
//根據數據庫名取得Database對象
    for I:=1 to NowDB.Tables.Count do
      begin
        NowTable:=NowDB.Tables.Item(I,0);
        TableList.add (NowTable.Name);
      end;  //取的這個數據庫中所有的表名字,添入TStringList中
    result:=True;
  Except
    TableList.Clear ;
    result:=False;
  end;
end;
類似的,用相似的方法可以以取得數據庫中所有的視圖(Views)、一個表或視圖的所有字段(Columns)、一個數據庫的所有數據文件組以及數據文件(FileGroups、DBFiles)等等,這些可以具體參考SQL-DMO的對象結構樹。
對SQL-DMO對象的使用可以遵循以下的基本步驟:通過上層對象取得某個對象或集合對象,然后使用對象或取得集合對象中某一個對象再使用。一般來說,如果是集合對象都有一個Item方法,可以根據Index或Name返回集合成員對象。需要注意的是Index是從1開始的而不是從0開始的。
上面的這些方法都是演示如何從數據庫取得信息,下面我再演示一個方法,此方法的功能是備份數據庫到一個文件。通過這個方法來展示如何對數據庫進行維護操作的。
function TDBCTRL.BackupDB(DBName, BackupFile: String): Boolean;
//傳入的參數為欲備份的數據庫名和備份文件名
var
  dmoBack:_Backup;         //備份對象
  backupdrv:_backupdevice;   //備份設備對象
begin
  //設置備份設備
try
  DeleteFile(BAckUPFile);    //若備份文件已經存在就刪除之
  try
    dmoBack:=coBackup.create;
    backupdrv:=coBackupDevice.Create ;  //創建對象
    backupdrv.name:=DBName+'Bak';    //指定備份設備的名字
    backupdrv.Type_ :=SQLDMODevice_DiskDump;
    backupdrv.PhysicalLocation :=BackupFile ;
     //添加備份設備
    try
      sqlServer.BackupDevices.Add(backupdrv);
    except
      //由于這里的異常不會返回值,沒有辦法,只能認為添加異常是由于已經存在這個備份集
    end;
    //進行備份
    dmoBack.action:=SQLDMOBackup_Database;
    dmoBack.database:=DBName;
    dmoBack.Devices :=DBName+'Bak';
    dmoBack.SQLBackup(sqlserver) ;  
    Result:=True;
  Except
    On E:EOleException do
     begin
       ShowMessage(e.Message);
       result:=false;
     end;
  end;
finally
   dmoBack:=nil;
   backupdrv:=nil;
end;
end;
另外,我還要舉一個例子來說明如何使用剛開始提到的Application對象。這個方法是取得所有可用(也就是可到達可連接)的Sql Server實例的名字。
function TDBCTRL.GetServerList(var ServerList: TStringList): Boolean;
var
  App:_Application;  //Application對象
  NList:NameList;   //這個NameList也是SQL-DMO中的一個對象
  I:integer;
begin
  try
    App:=CoApplication.Create ;
    NList:=App.ListAvailableSQLServers;  
//取得所有可用的SQLServer實例名
    for I:=0 to NLIst.Count-1 do
         ServerList.Add(NList.Item(I));
  finally
    App:=nil;  //釋放對象
  end;
end;
當然,TDBCTRL組件還有很多方法,但是代碼實現相似,比如對應備份的恢復方法,對應于連接的斷開連接方法,我也就不一一列舉了。讀者可以參考示例代碼和SQL SERVER的Online Book,舉一反三,實現自己想要的功能。如果需要此組件的全部代碼可以問筆者索要。

其它說明

SQL-DMO的2000版本完全兼容于SQL SERVER7.0和SQL SERVER 2000。但是提供80多個新的接口用來支持SQL SERVER 2000的新特性。這些新的接口結尾都帶”2”,這些是原來的SQL SERVER 7.0中那些接口的超集。也就是說如果要使用SQL SERVER 2000的新特性就要使用末尾帶”2”的接口。

參考書目

l         Microsoft MSDN
l         Microsoft SQL SERVER Online Book
l         《Delphi COM 深入編程》(美) Eric Harmon 機械工業出版社

上一篇:Delphi控制Excel的重要屬性和方法

下一篇:Delphi中實現界面與業務邏輯的分離

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
學習交流
熱門圖片

新聞熱點

疑難解答

圖片精選

網友關注

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
在线国产精品播放| 欧美特黄级在线| 青青久久av北条麻妃海外网| 亚洲一区二区在线| 精品无人国产偷自产在线| 亚洲男人的天堂在线| 国产99视频在线观看| 欧美极品在线视频| 久久久久久久久久久国产| 一区二区三区精品99久久| 性色av一区二区咪爱| 成人午夜黄色影院| 久久精品视频导航| 激情成人在线视频| 精品久久国产精品| 在线观看国产精品日韩av| 亚洲自拍偷拍色片视频| 亚洲精品中文字幕有码专区| 欧美丝袜美女中出在线| 国产精品久久婷婷六月丁香| 九九久久综合网站| 中文字幕一区二区精品| 亚洲二区在线播放视频| 国产精品99久久久久久久久| 欧美男插女视频| 日韩美女视频免费看| 国产在线观看不卡| 91久久精品在线| 8090理伦午夜在线电影| 欧美精品中文字幕一区| 精品香蕉在线观看视频一| 国产999精品视频| 成人看片人aa| 国产日韩精品视频| 91精品国产91| 久久好看免费视频| 成人情趣片在线观看免费| 日韩欧美精品免费在线| 亚洲国产精品美女| www.日韩不卡电影av| 欧美午夜精品伦理| 日本电影亚洲天堂| 91综合免费在线| 久久久久亚洲精品成人网小说| 日韩成人在线播放| 亚洲永久在线观看| 久久精品免费播放| 亚洲一区二区三区成人在线视频精品| 亚洲第一区在线观看| 成人精品一区二区三区电影免费| 亚洲欧美制服丝袜| 久久好看免费视频| 精品激情国产视频| 午夜精品久久久久久久99黑人| 日韩极品精品视频免费观看| 国产亚洲一级高清| 97视频免费在线观看| 狠狠色噜噜狠狠狠狠97| 久久99视频精品| 久久久久久久网站| 日韩电影在线观看中文字幕| 久久久亚洲国产天美传媒修理工| 欧美成人午夜激情在线| 国产精品∨欧美精品v日韩精品| 日韩高清电影好看的电视剧电影| 欧洲s码亚洲m码精品一区| 欧美精品生活片| 国产偷国产偷亚洲清高网站| 亚洲欧美中文字幕在线一区| 国产久一一精品| xxxx性欧美| 一区国产精品视频| 亚洲一区国产精品| 91成人国产在线观看| 成人黄色在线观看| 日韩欧美在线中文字幕| 欧美亚洲国产日本| 伊人亚洲福利一区二区三区| 精品一区精品二区| 精品中文字幕乱| 亚洲系列中文字幕| 亚洲欧洲国产精品| 国产精品热视频| 久久精品最新地址| 久久中文字幕国产| 欧美体内谢she精2性欧美| 日日噜噜噜夜夜爽亚洲精品| 国产一区二区在线免费视频| 国产精品久久久久久久久久久久| 日韩av在线免播放器| 日韩视频欧美视频| 国内精品美女av在线播放| 欧美日韩国产精品一区| 亚洲精品网站在线播放gif| 成人久久久久久久| 亚洲网站在线观看| 在线看欧美日韩| 正在播放国产一区| 欧美成人黑人xx视频免费观看| 欧美午夜精品久久久久久人妖| 国产亚洲精品久久久久久牛牛| 亚洲资源在线看| 日韩成人网免费视频| 91精品国产色综合久久不卡98口| 国产精品久久久av| 国产亚洲精品久久久优势| 成人精品一区二区三区| 欧美大胆在线视频| 日韩电影在线观看免费| 亚洲天堂男人天堂女人天堂| 国产日韩在线视频| 亚洲网站在线观看| 国产999精品视频| 懂色av一区二区三区| 色无极亚洲影院| 日韩视频中文字幕| 欧美一级黑人aaaaaaa做受| 国产精品视频区1| 97在线视频免费播放| 国产综合福利在线| 精品激情国产视频| 欧美丰满老妇厨房牲生活| 日韩电影免费在线观看中文字幕| www欧美xxxx| 亚洲美女性视频| 热re99久久精品国产66热| 中文字幕久热精品在线视频| 欧美在线性爱视频| 日本19禁啪啪免费观看www| 精品中文字幕久久久久久| 亚洲国产精品va在线观看黑人| 久久亚洲综合国产精品99麻豆精品福利| 久久精品影视伊人网| 日韩中文字幕在线精品| 色综合视频一区中文字幕| 久久亚洲精品一区| 富二代精品短视频| 国产精品日韩一区| 色综合久久天天综线观看| 456亚洲影院| 欧亚精品在线观看| 91精品在线国产| 茄子视频成人在线| 色噜噜亚洲精品中文字幕| 日韩综合中文字幕| 日韩欧美精品免费在线| 欧美日韩免费区域视频在线观看| 亚洲影院在线看| 日韩精品视频免费在线观看| 国产成人一区二区三区小说| 69av成年福利视频| 一区二区三区在线播放欧美| 欧美大片在线看| 欧美精品xxx| 日韩av影视在线| 欧美专区福利在线| 一级做a爰片久久毛片美女图片| 国产精品久久久久久久久久小说| 欧美精品videos另类日本| 国产欧美日韩中文字幕| 国产999在线| 国产精品爱啪在线线免费观看| 午夜精品福利电影| 欧美在线视频一二三|