打印本文 打印本文 关闭窗口 关闭窗口
使用SQL-DMO实现定制SQLScripts
作者:武汉SEO闵涛  文章来源:敏韬网  点击数2157  更新时间:2009/4/22 23:22:14  文章录入:mintao  责任编辑:mintao


      我是个负责数据库应用的开发人员,昨夜和旧同事电话聊天中谈到了一个
  大家共同的苦恼:因为几乎每天都要将自己的数据库项目生成SQL Scripts
  以供备份存档或发给客户更新,所以生成SQL Scripts就成了每天的必修课。
  而SQLSERVER的企业管理器又无法支持将生成SQL Scripts的过程保存为一个设置
  文件,每次都必须做许多相同的工作,
  如:选择对象呀、设置格式呀、表脚本选项、文件选项。。老是重复这样的操作
  实在太麻烦了!电话闲聊完后就想:能不能写个小工具,在可以提供SQLSERVER
  企业管理器所支持所有功能外,再增加个支持将各个选项的设置保存为
  配置文件(如:ini或XM格式)的功能呢?这样我以后只要选取不同的配置文件就可以
  直接生成出自己需要的Scripts格式,那样多好呀。。。
      但如何实现Scripts的生成呢?就考虑使用下以前很少用的SQL-DMO吧!
  心动不如行动,虽然夜已深,但有新鲜的体验总让我精神抖擞。。。呵呵,好了
  不废话了。。就先简单地谈谈如何使用SQL-DMO来实现自己的需求吧~~~~
      (代码示例使用Pascal语言表述)
   
      1. 枚举局域网内所有的SQLSERVER实例
      函数:
           function GetAllServerInstances :TStringList;
           var
             oApplication ,
             oSeverNameList : Variant ;
             i : integer ;
             sNameList : TStringList ;
           begin
             sNameList := TStringList.Create ;
             oApplication := CreateOLEObject ('SQLDMO.Application') ;
             oSeverNameList := oApplication.ListAvailableSQLServers ;
             for i:= 1 to oSeverNameList.Count do
               sNameList.Append (oSeverNameList.Item(i)) ;
             Result := sNameList ;
             oApplication := NULL;
             oSeverNameList := NULL;
           end;
        
      2.登陆到指定的SQLSERVER实例
      函数:
           function LoginServerInstances (sServer,sUser,sPassword :string):Variant;
           var
             oSQLServer : Variant ;
           begin
             oSQLServer := CreateOLEObject  ('SQLDMO.SQLServer');
             oSQLServer.LoginTimeout := 30;
             oSQLServer.LoginSecure := False;
             oSQLServer.AutoReconnect := True;
             oSQLServer.Connect(sServer,sUser,sPassword);
             Result := oSQLServer;
             oSQLServer := NULL ;
           end;
        
  以上两个函数可以帮助我们完成取得局域网内所有的SQLSERVER实例并且
  登陆上一个指定的实例。接下来就看看如何取得指定数据库的表名称和存储
  过程名称 :
 
       3.枚举指定Sqlserver实例所有database的名称
       函数:
           function GetAllDatabaseNameList (oSQLServer : Variant ):TStringList;
           var
             sNameList : TStringList ;
             i : integer;
           begin
             sNameList := TStringList.Create ;
             for i:= 1 to oSQLServer.Databases.Count do
               sNameList.Append (oSQLServer.Databases.Item(i).Name) ;
             Result := sNameList ;
           end;
       
       4.枚举指定数据库所有Table的名称
       函数:
            function GetAllTableNameList (oSQLServer : Variant ; sDataBaseName : string ):TStringList;
            var
              oDatabase : Variant ;
              sNameList : TStringList ;
              i : integer;
            begin
              sNameList := TStringList.Create ;
              oDatabase  := CreateOLEObject  ('SQLDMO.Database');
              oDatabase := oSQLServer.Databases.Item(sDataBaseName);
              for i:= 1 to oDatabase.Tables.Count do
                sNameList.Append (oDatabase.Tables.Item(i).Name) ;
              Result := sNameList ;
              oDatabase := Null ;
            end;

       5.枚举指定数据库所有StoreProcedure的名称
       函数:
            function GetAllStoreProcedureNameList (oSQLServer : Variant ; sDataBaseName : string ):TStringList;
            var
              oDatabase : Variant ;
              sNameList : TStringList ;
              i : integer;
            begin
              sNameList := TStringList.Create ;
              oDatabase  := CreateOLEObject  ('SQLDMO.Database');
              oDatabase := oSQLServer.Databases.Item(sDataBaseName);
              for i:= 1 to oDatabase.StoredProcedures.Count do
                sNameList.Append (oDatabase.StoredProcedures.Item(i).Name) ;
              Result := sNameList ;
              oDatabase := Null ;
            end; 
     
      通过以上3个函数就可以把生成Scripts前的准备工作做好了,然后就可以开始
  着重了解如何生成Scripts了。Scripts也同样是SQL-DMO某些对象的Method。这些
  对象如:Database,View ,StoredProcedure ,Trigger ,Check 等等。
  Scripts Method 的Syntax是:
    object.Script( [ ScriptType ] [, ScriptFilePath ] [, Script2Type ] ) as String
  ScriptType (integer type) 参数是来设定产生什么内容的Scripts ,如对其赋值SQLDMOScript_Default,
  这样就产生的是 该对象普通的脚本,如StoredProcedure object,那肯定就是
  其create StoredProcedure 的内容咯。如果赋值SQLDMOScript_Drops的话,
  那就产生的是drop object的内容。关于ScriptType,Script2Type (integer type)
  这个参数的详细使用可以  参阅 : C:\Program Files\Microsoft SQL Server\80\Tools\Books\sqldmo.chm
  的帮助文件。Script方法的返回值是文本类型,不管你填不填ScriptFilePath参数,
  你都能得到该文本,也就是Script 的内容。

      而Table ,UserDefinedDatatype 这两个对象生成Scripts的Method比较特殊,
  它们调用的是GenerateSQL Method,其Syntax是:
    object.GenerateSQL( Database ) as String ,比较简单没有过多的参数,返回值
  也是Script 的内容。
 
      建议:把ScriptType,Script2Type两个参数可以赋予的值做成常量,这样在程序
  中调用更直观些。如:SQLDMOScript_DatabasePermissions = 32;
  SQLDMOScript_Default = 4; ....
 
  根据上面的说明可以建立这个函数(在申明此函数时填加overload表示同名不同参函数的重载):
    file://6.生成指定Objects的Sql Scripts

[1] [2]  下一页

打印本文 打印本文 关闭窗口 关闭窗口