使用SQL-DMO實現定製SQL Scripts (轉)

amyz發表於2007-08-16
使用SQL-DMO實現定製SQL Scripts (轉)[@more@]


  我是個負責應用的開發人員,昨夜和舊同事電話中談到了一個
  大家共同的苦惱:因為幾乎每天都要將自己的資料庫專案生成 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 := CreateOLE ('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,sPass :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 80ToolsBookssqldmo.chm
  的幫助檔案。Script方法的返回值是文字型別,不管你填不填ScriptFilePath引數,
  你都能得到該文字,也就是Script 的內容。

  而Table ,UserDefinedDatatype 這兩個物件生成Scripts的Method比較特殊,
  它們的是GenerateSQL Method,其Syntax是:
  object.GenerateSQL( Database ) as String ,比較簡單沒有過多的引數,返回值
  也是Script 的內容。
 
  建議:把ScriptType,Script2Type兩個引數可以賦予的值做成常量,這樣在
  中呼叫更直觀些。如:SQLDMOScript_DatabasePessions = 32;
  SQLDMOScript_Default = 4; ....
 
  根據上面的說明可以建立這個函式(在申明此函式時填加overload表示同名不同參函式的過載):
  成指定Objects的Sql Scripts
  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;
  成指定Objects的Sql Scripts
  // overload Method
  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');
  成create procedure的Scripts,將第一個4換成1就成了drop procedure的 Scripts了
  ReturnStr := GetThisObjectScripts(oStoredProcedure,'',4,4); 
  ShowMessage(ReturnStr);
  end; 

  如果多個物件都需要匯出 Scripts 話,可以用個string 變數儲存被迴圈呼叫的
  GetThisObjectScripts過程,就可以實現匯出多個物件的指令碼了!
 
 
  關於儲存和取出配置生成Scripts的過程,我想不用詳細描述了吧?
  只需把設定好的狀態儲存到配置檔案中,並且可以呼叫配置檔案
  反向對控制元件狀態來設定,這樣就簡單的實現了自定義的過程呀。
  呵呵,到這裡就進入尾聲了,透過組合上面這些函式,
  並且設定合理的介面呼叫,這程式應該很容易完成吧~~~~
  既然這樣,那讓我們為提供自己工作而建立更多小工具呀! 
 
  更多詳情,請參閱 :
  C:Program FilesMicrosoft SQL Server80ToolsBookssqldmo.chm
 
 
 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752019/viewspace-962629/,如需轉載,請註明出處,否則將追究法律責任。

相關文章