频道直达 - 专题 - 新闻 - 技巧 - 组网 - 开发 - 安全 - web编程 - 图像 - 操作系统 - 数据库 - 教育 - 旅游 - 健康 - 时尚 - 驱动 - 软件 - 游戏 - 多媒体 - ERP - 讨论组

用Delphi对SQL-DMO进行封装的一种实现

来源: 作者: 出处:巧巧读书 2007-12-12 进入讨论组

SQL-DMO简介

Microsoft SQL Server是当前比较流行的数据库管理系统。随着SQL Server的不断完善与发展,以及与微软本身的Windows系列操作系统的完美结合,在Windows平台上提供较好的性能和易用性,因此越来越受到人们的重视。

SQL-DMO的全称是SQL Distributed Management Objects。它是一个集合,包含一组有双重接口的COM。通过SQL-DMO我们可以控制操作SQL Server 的数据库引擎和复制管理。由于SQL-DMO是一组COM,所以任何可以使用COM的开发工具都可以使用它,包括VBDelphiVCBCBASP等等几乎包括所有的Windows平台下的开发工具。

SQL-DMO用途

我们为什么需要使用SQL-DMO对数据库进行管理呢?难道我们用Enterprise ManagerT-SQL 脚本对数据库进行管理还不够吗?

SQL-DMO可以进行灵活、可定制、高效的数据库管理活动。由于SQL-DMO提供的是SQL SERVER的管理接口,通过编程,你就可以按照自己的需求,定制管理活动。举个例子,如果我们管理的是一个大型组织,里面有很多个SQL Server实例。现在要给组织中所有的SQL Server实例添加一个用户,若通过Enterprise Manager手工给每个SQL Server实例进行添加用户话就是一个费时费力而且容易出现人为错误的操作,若使用SQL-DMO编程实现话,用一个循环操作就可以简单高效的完成。

在作者看来,更为重要的是:使用SQL-DMO可以管理MSDEMicrosoft SQL Server Desktop Engine)。MS SQL SERVER价格昂贵,而MSDE是免费的。在一些中小型应用中,MSDE已经足够。但是,由于MSDE只提供数据库引擎不提供可视化的管理界面,无法对MSDE中的数据库进行常规管理,限制了MSDE的适用范围。此时如果我们使用SQL-DMO就可以提供自己的数据库管理界面,这样就能对MSDE中的数据库进行一定的常规管理。如果不考虑时间和成本的话,完全可以做出一个功能类似于Enterprise Manager的管理界面。实际上Enterprise Manager的绝大部分功能也是通过使用SQL-DMO实现的。(其中用到SQL-NSSQL-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):

Your application

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对象代表着一个全局的应用,其包含了ServersServerGroups两个集合对象。如图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的类型库,并生成对应的描述代码。代码当中的包含很多DelphiCom对象的一些常规用法和惯用表示法。在这里不讨论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就会忽略LoginPassword

  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.

URl收藏 http://www.qqread.com/delphi/d379116002.html进入讨论组讨论。
收藏此文】【 】【打印】【关闭
相关图文阅读
频道图文推荐
健 康 咨 询
时 尚 咨 询
巧巧读书宗旨
相关专题
讨论组问题推荐
站内各频道最新更新文档
站内最新制作专题
热门关键字导读
Photoshop教 程照片处理 照片制作 PS快捷键 抠图
计 算 机 故 障XP系统修复
艺 术 与 设 计设计 流媒体 设计欣赏 边框
计 算 机 安 全ARP
站内频道文章精选
巧巧电脑频道编辑信箱  告诉我们您想看的专题或文章