国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 綜合 > 正文

使用SQL-DMO實現定制SQL Scripts

2024-07-21 02:08:38
字體:
來源:轉載
供稿:網友


      我是個負責數據庫應用的開發人員,昨夜和舊同事電話聊天中談到了一個
  大家共同的苦惱:因為幾乎每天都要將自己的數據庫項目生成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 qldmo.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
    file://(osqlobjcet : database,view ,storedprocedure ,trigger ,check)
    // sscriptfilepath defalut is ''
    function getthisobjectscripts (osqlobjcet : variant ;sscriptfilepath : string ;
                                   iscripttype,iscript2type : integer) : string ;
    begin
      result := osqlobjcet.script(iscripttype,sscriptfilepath,iscript2type) ;
    end;
    file://7.生成指定objects的sql scripts
      // overload method
      file://(osqlobjcet : table ,userdefineddatatype)
    function tform1.getthisobjectscripts (odatabase ,osqlobjcet : variant ) : string ;
    begin
      result := osqlobjcet.generatesql(odatabase) ;
    end;
  
  調用的時候可以根據界面選擇生成什么樣格式的對象就傳入相應的參數
  寫個簡單的例子,取出master的存儲過程ms_sqlctrs_users的內容:
     procedure tform1.button4click(sender: tobject);
     var
       osqlserver,
       odatabase,
       ostoredprocedure : variant ;
       returnstr : string;
     begin
       odatabase  := createoleobject  ('sqldmo.database');
       osqlserver := loginserverinstances('david','sa','');
       odatabase := osqlserver.databases.item('master');
       ostoredprocedure := osqlserver.databases.item('master').storedprocedures.item('ms_sqlctrs_users');
       file://生成create procedure的scripts,將第一個4換成1就成了drop procedure的 scripts了
       returnstr := getthisobjectscripts(ostoredprocedure,'',4,4); 
       showmessage(returnstr);
     end; 

  如果多個對象都需要導出 scripts 話,可以用個string 變量保存被循環調用的
  getthisobjectscripts過程,就可以實現導出多個對象的腳本了!
 
 
  關于保存和取出配置生成scripts的過程,我想不用詳細描述了吧?
  只需把設置好的控件狀態保存到配置文件中,并且可以調用配置文件
  反向對控件狀態來設置,這樣就簡單的實現了自定義的過程呀。
  呵呵,到這里就進入尾聲了,通過組合上面這些函數,
  并且設置合理的界面調用,這程序應該很容易完成吧~~~~
  既然這樣,那讓我們為提供自己工作效率而建立更多小工具呀!  
 
  更多詳情,請參閱 :
  c:/program files/microsoft sql server/80/tools/books qldmo.chm
 
 
 


收集最實用的網頁特效代碼!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 高青县| 共和县| 慈利县| 长海县| 山阳县| 威宁| 安乡县| 固安县| 武定县| 额济纳旗| 青海省| 扎兰屯市| 山阳县| 东明县| 卢氏县| 综艺| 柳江县| 仪征市| 曲靖市| 温泉县| 伊金霍洛旗| 和静县| 龙门县| 卢氏县| 太原市| 栾城县| 浠水县| 泽普县| 寻甸| 绥中县| 自贡市| 甘泉县| 延吉市| 安福县| 雷波县| 德阳市| 云林县| 恩施市| 磐安县| 衡东县| 土默特左旗|