首先, 需要把 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
;
打开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的版本
































取安裝SQLSERVER操作系統的版本
























停止SQLServer



















暫停SQLServer


















取SQLSERVER的狀態


































啟動SQLServer服務



























創建備份設備


























刪除備份設備































取所有的備份設備
































殺所有連接SqlServer的線程















































取服務器所有的資料庫
































取網絡中所有SQLServer服務器列表

























刪除資料庫



















創建資料庫


















































停止SQLSERVER代理

























啟動SQLServer代理

























取SQL的安裝路徑















