Delphi通过SQLDMO來控制SQLSERVER

 首先, 需要把 SQLDMO.DLL 文件导入到DELPHI 中。sqldmo.dll 是一个com, 安装SQLServer 后位于 Program Files/Microsoft SQL Server/80/Tools/Binn
打开Delphi,Project菜单->Import Type Library...,在列表框中找到"Microsoft SQLDMO ObjectLibrary(Version 8.0)"
导入完后,当我们Compile的时候却发现这个单元无法编译, 提示大意为ID重复定义, 这个简单, 找到不能编辑的地方,把ID 改成 xID就行了,这样就可以编译通过。
在使用过程中,我发现在很多情况下,SQLDMO_TLB.pas中的类是不能用的, 出现av错误。比如Restore,必须这样使用: CreateOleObject('SQLDMO.Restore');
定义相同的类,如TTABLE等,这个需要处理一下,在TTABLE前加单元名,如DBE.TTABLE 或 SQLDMO_TLB.TTABLE 就OK啦。
下需介绍几个常用的功能。

取SQLSERVER的版本
function  getSQLVersion(ServerName,LoginName,LoginPassword:String):TSqlVersion;
var
     osqlserver :_SqlServer;
     temp :SQLDMO_SQL_VER;
begin
     try
          oSqlserver :
= coSqlserver.Create;
          oSqlserver._AddRef;
          oSqlserver.Name :
= ServerName;
          temp :
= oSqlserver.PingSQLServerVersion(ServerName,LoginName,LoginPassword);
          
if  temp = SQLDMOSQLVer_Unknown  then
               result :
= UnknownVer
          
else   if  temp = SQLDMOSQLVer_Pre_ 60   then
               result :
= SQL60
          
else   if  temp = SQLDMOSQLVer_ 60   then
               result :
= SQL60
          
else   if  temp = SQLDMOSQLVer_ 65   then
               result :
= SQL65
          
else   if  temp = SQLDMOSQLVer_ 70   then
               result :
= SQL70
          
else
               result :
= SQL2000;
          oSqlserver._Release;
          oSqlserver :
= nil ;
     except
          on E :Exception 
do
          
begin
               application.MessageBox(Pchar(‘取SQLSERVER版本資訊出錯:‘
+ E.message),‘系統提示‘,MB_OK + MB_ICONSTOP);
          
end ;
     
end ;
end ;


取安裝SQLSERVER操作系統的版本
function  getOSType(ServerName:String):ToSTypes;
var
     oSqlserver :_SqlServer;
begin
     try
          oSqlServer :
= coSqlServer.Create;
          oSqlserver._AddRef;
          oSqlserver.Name :
= ServerName;
          
if  oSqlserver.IsOS(SQLDMO_WIN95)  then
               result :
= Win98ORWin95
          
else   if  oSqlserver.IsOS(SQLDMO_WINNT)  then
               result :
= WinNTOR2000
          
else
               result :
= SysUnknown;
          oSqlserver._Release;
          oSqlserver :
= nil ;
      except
          on E :Exception 
do
          
begin
               application.MessageBox(Pchar(‘取SQLSERVER操作系統出錯:‘
+ E.message),‘系統提示‘,MB_OK + MB_ICONSTOP);
          
end ;
     
end ;
end ;


停止SQLServer
function  stopSQLServer(serverName:String):Boolean;
var
     oSqlserver :_SqlServer;
begin
     try
          oSqlServer :
= coSqlserver.Create;
          oSqlserver._AddRef;
          oSqlserver.Name :
= ServerName;
          oSqlServer.Stop;
          oSqlserver._Release;
          oSqlserver :
= nil ;
     except
          on E :Exception 
do
          
begin
               application.MessageBox(Pchar(‘停止SQLSERVER服務出錯:‘
+ E.message),‘系統提示‘,MB_OK + MB_ICONSTOP);
           
end ;
     
end ;
end ;


暫停SQLServer
function  PauseSQLServer(ServerName:String):Boolean;
var
     oSqlserver :_SqlServer;
begin
     try
          oSqlServer :
= coSqlserver.Create;
          oSqlserver._AddRef;
          oSqlserver.Name :
= ServerName;
          oSqlServer.Pause;
          oSqlserver._Release;
          oSqlserver :
= nil ;
     except
          on E :Exception 
do
          
begin
               application.MessageBox(Pchar(‘暫停SQLSERVER服務出錯:‘
+ E.message),‘系統提示‘,MB_OK + MB_ICONSTOP);
          
end ;
     
end ;
end ;

取SQLSERVER的狀態
function  getSQLServerStatus(ServerName:String):TSQlServerStatus;
var
     oSqlServer :_SqlServer;
begin
     try
          osqlserver :
= coSqlserver.Create;
          osqlServer._AddRef;
          osqlserver.Name :
= serverName;
          
if  oSqlserver.Status = SQLDMOSvc_Unknown  then
               result :
= Unknown
          
else   if  oSqlserver.Status = SQLDMOSvc_Running  then
               result :
= Running
          
else   if  oSqlserver.Status = SQLDMOSvc_Paused  then
               result :
= Paused
          
else   if  oSqlserver.Status = SQLDMOSvc_Stopped  then
               result :
= Stopped
          
else   if  oSqlserver.Status = SQLDMOSvc_Starting  then
               result :
= Starting
          
else   if  oSqlserver.Status = SQLDMOSvc_Stopping  then
               result :
= Stopping
          
else   if  oSqlserver.Status = SQLDMOSvc_Continuing  then
               result :
= Continuing
          
else   if  oSqlserver.Status = SQLDMOSvc_Pausing  then
               result :
= Pausing;
          oSqlserver._Release;
          oSqlserver :
= nil ;
     except
          on E :Exception 
do
          
begin
               application.MessageBox(Pchar(‘取SQLSERVER狀態出錯:‘
+ E.message),‘系統提示‘,MB_OK + MB_ICONSTOP);
          
end ;
     
end ;
end ;

啟動SQLServer服務
function  StartSQLServer(ServerName,LoginName,LoginPassword:String):Boolean;
var
     oSqlServer :_SqlServer;
begin
     try
          osqlserver :
= coSqlserver.Create;
          oSqlServer._AddRef;
          osqlserver.Name :
= serverName;
          
if  oSqlServer.Status  = SQLDMOSvc_Stopped  then   // 服務停止
               oSqlServer.Start(False,ServerName,LoginName,LoginPassword);
          
if  oSqlServer.Status = SQLDMOSvc_Paused  then   // 服務暫停
               oSqlServer.Continue;
          
if  (oSqlServer.Status = SQLDMOSvc_Paused)  or  (oSqlServer.Status = SQLDMOSvc_Stopped)  then
               result :
= False
          
else
               result :
= true;
          oSqlServer._Release;
          oSqlServer :
= nil ;
     except
          on E :Exception 
do
          
begin
               result:
= False;
               application.MessageBox(Pchar(‘啟動SQLSERVER服務出錯:‘
+ E.message),‘系統提示‘,MB_OK + MB_ICONSTOP);
          
end ;
     
end ;
end ;

創建備份設備
procedure  createBackUpDevice(serverName,LoginName,LoginPassword,DeviceName,FileName:String);
var
  osqlServer :_SqlServer;
  oBackupDevice :_BackupDevice;
begin
  try
    osqlServer :
= coSqlServer.Create;
    osqlserver._AddRef;

    osqlServer.Connect(servername,LoginName,LoginPassword);
    oBackupDevice :
= coBackupDevice.Create;
    oBackupDevice.Name :
= DeviceName;
    oBackupDevice.PhysicalLocation :
= FileName;
        oBackupDevice.Type_ :
= SQLDMODevice_DiskDump;
    osqlServer.BackupDevices.Add(oBackupDevice);
    osqlServer.DisConnect;
    osqlserver._Release;
    osqlserver :
= nil ;
  except
    on E :Exception 
do
    
begin
      application.MessageBox(Pchar(‘創建SQLSERVER備份設備出錯:‘
+ E.message),‘系統提示‘,MB_OK + MB_ICONSTOP);
    
end ;
  
end ;
end ;

刪除備份設備
procedure  dropBackUpDevice(serverName,Loginname,LoginPassword,deviceName:String);
var
  osqlServer :_SqlServer;
  count,i:Integer;
  oBackupDevice :_BackupDevice;
begin
  try
    osqlServer :
= coSqlServer.Create;
    osqlServer._AddRef;
    osqlServer.Connect(servername,LoginName,LoginPassword);
    count :
= osqlServer.BackupDevices.Count;
    For i :
= 1   to  count  do
    
begin
      oBackupDevice:
= osqlServer.BackupDevices.Item(i);
      
if  UpperCase(Trim(oBackupDevice.Name)) = UpperCase(trim(deviceName))  then
      
begin
        oSqlServer.BackupDevices.Remove(i);
        break;
      
end ;
    
end ;
    oSqlserver.DisConnect;
    oSqlServer._Release;
    oSqlServer :
= nil ;
  except
    on E :Exception 
do
    
begin
      application.MessageBox(Pchar(‘刪除SQLSERVER備份設備出錯:‘
+ E.message),‘系統提示‘,MB_OK + MB_ICONSTOP);
    
end ;
  
end ;
end ;

取所有的備份設備
function  GetBackupDeviceInfo(serverName,LoginName,LoginPassword:String):TStringList;
var
  osqlServer :_SqlServer;
  count,i:Integer;
  oBackupDevice :_BackupDevice;
  rtn :TStringList;
begin
  try
    osqlserver :
= cosqlServer.Create;
    osqlServer._AddRef;
    osqlserver.Connect(serverName,LoginName,LoginPassword);
    count :
= osqlServer.BackupDevices.Count;
    rtn :
= TStringList.Create;
    
    For i :
= 1   to  count  do
    
begin
      oBackupDevice :
= oSqlserver.BackupDevices.Item(i);
      rtn.Append(oBackupDevice.Name);
    
end ;
    
    result :
= rtn;
    osqlserver.DisConnect;
    osqlserver._Release;
    osqlserver :
= nil ;
  except
    on E :Exception 
do
    
begin
      application.MessageBox(Pchar(‘取SQLSERVER備份設備資訊出錯:‘
+ E.message),‘系統提示‘,MB_OK + MB_ICONSTOP);
    
end ;
    
end ;
end ;

殺所有連接SqlServer的線程
procedure  killprocess(serverName,dataBaseName,LoginName,LoginPassword:String);
var
  oqr :QueryResults;
  osqlServer :_SqlServer;
  coli,colcount,count,i :Integer;
  rs : _RecordSet;
  iColPIDNum :Integer;
  iColDbName :Integer;
  strName,strDBName:String;
  lPID :Integer;
begin
  try
    osqlserver :
= coSqlserver.Create;
    osqlserver._AddRef;
    osqlServer.Connect(serverName,Loginname,LoginPassword);
    oqr :
= osqlserver.EnumProcesses( - 1 );
    iColPIDNum :
=- 1 ;
    iColDbName :
=- 1 ;
    colcount :
= oqr.Columns;
    
    
for  i : = 1   to  colcount  do
    
begin
      strName :
= oqr.ColumnName[i];
      
if  Uppercase(strName) = ‘SPID‘  then
        iColPIDNum :
= i
      
else   if  Uppercase(strName) = ‘DBNAME‘  then
        iColDbName :
= I;
      
      IF (iColPIDNum
<>- 1 and  (iColDbName <>- 1 then
        break;
    
end ;
    
    count :
= oqr.Rows;
    
for  i : = 1   to  count  do
    
begin
      lPID :
= oqr.GetColumnLong(i,iColPIDNum);
      strDBName:
= oqr.GetColumnString(i,iColDbName);
      
if  Uppercase(Trim(strDBName)) = Uppercase(trim(dataBaseName))  then
        oSqlserver.KillProcess(lPID);
    
end ;
  except
    on E :Exception 
do
    
begin
      application.MessageBox(Pchar(‘刪除Sqlserver線程出錯:‘
+ E.message),‘系統提示‘,MB_OK + MB_ICONSTOP);
    
end ;
  
end ;
 
end ;

取服務器所有的資料庫
function  getAllDataBases(serverName,LoginName,LoginPassword:String):TStringList;
var
  oSqlServer :_SqlServer;
  rtn :TStringList;
  odataBase :_DataBase;
  count,i :Integer;
begin
  try
    osqlServer :
= coSqlServer.Create;
    osqlServer._AddRef;
    osqlServer.Connect(ServerName,LoginName,LoginPassword);
    count :
= osqlServer.Databases.Count;
    rtn :
= TStringList.Create;
    
    
for  i : = 1   to  count  do
    
begin
      odataBase :
= osqlserver.Databases.Item(i,‘owner‘);
      rtn.Append(odataBase.Name);
    
end ;
    
    result :
= rtn;
    osqlServer.DisConnect;
    oSqlServer._Release;
    osqlServer :
= nil ;
  except
    on E :Exception 
do
    
begin
      application.MessageBox(Pchar(‘取SQLSERVER資料庫列表出錯了‘
+ E.message),‘系統提示‘,MB_OK + MB_ICONSTOP);
    
end ;
  
end ;
end ;

取網絡中所有SQLServer服務器列表
Function GetAllServers:TStringList;
var
  sApp : _Application ;
  sName : NameList;
  rtn :TStringList;
  count,i :Integer;
begin
  try
    sApp :
= coApplication.Create;
    sName :
= sApp.ListAvailableSQLServers;
    rtn :
= TStringList.Create;
    count :
= SName.Count;
    
    
for  i : = 0   to  count  - 1   do
      rtn.Append(sName.Item(i));

    result :
= rtn;
  except
    on E :Exception 
do
    
begin  
      application.MessageBox(Pchar(‘取網絡中的SQLSERVER列表出錯了‘
+ E.message),‘系統提示‘,MB_OK + MB_ICONSTOP);
    
end ;
  
end ;
end ;

刪除資料庫
procedure  dropDatabase(serverName,LoginName,LoginPassword,dataBaseName:String);
var
  osqlServer:_SqlServer;
begin
  try
    osqlServer :
= coSqlserver.Create;
    osqlServer._AddRef;
    osqlServer.Connect(serverName,LoginName,LoginPassword);
    osqlServer.Databases.Remove(dataBaseName,‘owner‘);
    oSqlServer.DisConnect;
    osqlServer._Release;
    oSqlServer :
= nil ;
  except
    on E:Exception 
do
    
begin
      application.MessageBox(Pchar(‘刪除資料庫錯誤:‘
+ E.Message),‘系統提示‘,MB_OK + MB_ICONSTOP);
    
end ;
  
end ;
end ;

創建資料庫
procedure  createDatabase(serverName,LoginName,LoginPassword,dataBaseName:String);
var
  odataBase :_Database;
  oDBFileData :_DBFile;
  oLogFile :_LogFile;
  osqlServer :_SqlServer;
begin
  try
    osqlServer :
= cosqlServer.Create;
    osqlServer._AddRef;
    osqlServer.Connect(serverName,LoginName,LoginPassword);
    odataBase :
= coDataBase.Create;
    odataBase._AddRef;
    oDBFileData :
= coDBFile.Create;
    oDBFileData._AddRef;
    oLogFile :
= coLogFile.Create;
    oLogFile._AddRef;
    oDataBase.Name :
= dataBaseName;
    oDBFileData.Name :
= dataBaseName;
    oDBFileData.PhysicalName :
= oSqlServer.Registry.SQLDataRoot  + ‘/data/‘ + dataBaseName + ‘.mdf‘;
    oDBFileData.PrimaryFile :
= true;
    oDBFileData.Size :
= 2 ;
    oDBFileData.FileGrowthType :
=  SQLDMOGrowth_MB;
    oDBFileData.FileGrowth :
=   1 ;
    oDatabase.FileGroups.Item(‘PRIMARY‘).DBFiles.Add(oDBFileData);
    
    oLogFile.Name :
= dataBaseName + ‘Log‘;
    oLogFile.PhysicalName :
= oSqlServer.Registry.SQLDataRoot  + ‘/data/‘ + dataBaseName + ‘.ldf‘;
    oLogFile.Size :
= 2 ;
    
    oDatabase.TransactionLog.LogFiles.Add(oLogFile);
    
    oSqlServer.Databases.Add(oDatabase);
    osqlServer.DisConnect;
    oSqlServer._Release;
    oSqlServer :
= nil ;
    oDataBase._Release;
    oDataBase :
= nil ;
    oDBFileData._Release;
    oDBFileData :
= nil ;
    oLogFile._Release;
    oLogFile :
= nil ;
  except
    on E:Exception 
do
    
begin
      application.MessageBox(Pchar(‘創建資料庫錯誤:‘
+ E.Message),‘系統提示‘,MB_OK + MB_ICONSTOP);
    
end ;
  
end ;
end ;

停止SQLSERVER代理
procedure  stopJobServer(serverName,LoginName,LoginPassword:String);
var
  oSqlServer :_SqlServer;
  oJobServer :JobServer;
begin
  try
    oSqlServer :
= coSqlServer.Create;
    oSqlServer._AddRef;
    osqlServer.Connect(ServerName,LoginName,LoginPassword);
    oJobServer :
= osqlServer.JobServer;
    
    
if  (oJobServer.Status = SQLDMOSvc_Running)  then
      OjobServer.Stop;

    oSqlServer.DisConnect;
    oSqlServer._Release;
    oSqlServer :
= nil ;
  except
    on E :Exception 
do
    
begin
      application.MessageBox(Pchar(E.Message
+ ‘停止SQLSERVER代理錯誤!‘),‘系統提示‘,MB_OK + MB_ICONSTOP);
    
end ;
  
end ;
end ;

啟動SQLServer代理
procedure  startJobserver(serverName,LoginName,LoginPassword:String);
var
  oSqlServer :_SqlServer;
  oJobServer :JobServer;
begin
  try
    oSqlServer :
= coSqlServer.Create;
    oSqlServer._AddRef;
    osqlServer.Connect(ServerName,LoginName,LoginPassword);
    oJobServer :
= osqlServer.JobServer;
    
    
if  (oJobServer.Status <> SQLDMOSvc_Starting)  and  (oJobServer.Status <> SQLDMOSvc_Running)  then
      OjobServer.Start;

    osqlServer.DisConnect;
    oSqlServer._Release;
    oSqlServer :
= nil ;
  except
    on E :Exception 
do
    
begin
      application.MessageBox(Pchar(E.Message
+ ‘啟動SQLSERVER代理錯誤!‘),‘系統提示‘,MB_OK + MB_ICONSTOP);
    
end ;
  
end ;
end ;

取SQL的安裝路徑
function  getSqlRootPath(serverName,LoginUserName,LoginPassword:String):String;
var
  osqlServer :_SqlServer;
begin
  try
    osqlServer :
= coSqlServer.Create;
    oSqlServer._AddRef;
    oSqlServer.Connect(ServerName,LoginUserName,LoginPassword);
    result :
= oSqlServer.Registry.SQLRootPath;
    osqlServer.DisConnect;
    osqlServer._Release;
    osqlServer :
= nil ;
  except
    Raise;
  
end ;
end ;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值