SQL-DMO (SQL Distributed Management Objects) 是 SQL Server 2000 時代的 COM 管理介面,封裝企業管理器所有功能。雖然已被 SMO (SQL Server Management Objects) 取代,但在維護舊系統、SQL Server 2000/2005 相容環境時仍具實用價值。
regsvr32 "C:\Program Files\Microsoft SQL Server\80\Tools\Binn\sqldmo.dll"
copy "C:\Program Files\Microsoft SQL Server\80\Tools\Binn\SQLDMO.rll"
"C:\Windows\System32\Resources\2052\SQLDMO.rll"
mkdir "C:\Windows\System32\Resources\2052" 2>nul
using SQLDMO;using System;
using SQLDMO;
public class SqlBackupManager
{
private string _server, _user, _pwd;
public SqlBackupManager(string server, string user, string pwd)
{
_server = server; _user = user; _pwd = pwd;
}
///
/// 完整資料庫備份
///
/// 來源資料庫名稱
/// 備份檔完整路徑 (.bak)
/// 備份集名稱
/// 備份描述
public void BackupDatabase(string databaseName, string backupPath,
string backupSetName, string description)
{
SQLServerClass sqlServer = null;
BackupClass backup = null;
try
{
sqlServer = new SQLServerClass();
sqlServer.LoginSecure = false; // SQL Server 驗證
sqlServer.Connect(_server, _user, _pwd);
backup = new BackupClass();
backup.Action = SQLDMO_BACKUP_TYPE.SQLDMOBackup_Database;
backup.Database = databaseName;
backup.Files = backupPath;
backup.BackupSetName = backupSetName;
backup.BackupSetDescription = description;
backup.Initialize = true; // 覆寫現有備份檔
backup.SQLBackup(sqlServer);
}
catch (Exception ex)
{
throw new ApplicationException($"備份失敗: {ex.Message}", ex);
}
finally
{
if (sqlServer != null) sqlServer.DisConnect();
}
}
///
/// 資料庫還原 (支援異地還原/改名)
///
/// 目標資料庫名稱 (可異於來源)
/// 備份檔路徑
/// 備份集編號 (預設 1)
/// 是否覆蓋現有資料庫
/// 檔案重新配置 (邏輯名 → 實體路徑)
public void RestoreDatabase(string targetDatabase, string backupPath,
int fileNumber = 1, bool replaceDatabase = true,
Dictionary moveFiles = null)
{
SQLServerClass sqlServer = null;
RestoreClass restore = null;
try
{
sqlServer = new SQLServerClass();
sqlServer.LoginSecure = false;
sqlServer.Connect(_server, _user, _pwd);
restore = new RestoreClass();
restore.Action = SQLDMO_RESTORE_TYPE.SQLDMORestore_Database;
restore.Database = targetDatabase;
restore.Files = backupPath;
restore.FileNumber = fileNumber;
restore.ReplaceDatabase = replaceDatabase;
// 異地還原:指定資料/記錄檔新路徑
if (moveFiles != null)
{
foreach (var kvp in moveFiles)
{
restore.DatabaseFiles = kvp.Key; // 邏輯檔名
restore.DatabaseFilePath = kvp.Value; // 新實體路徑
}
}
restore.SQLRestore(sqlServer);
}
catch (Exception ex)
{
throw new ApplicationException($"還原失敗: {ex.Message}", ex);
}
finally
{
if (sqlServer != null) sqlServer.DisConnect();
}
}
}
var mgr = new SqlBackupManager("192.168.1.100", "sa", "StrongPwd123");
// 完整備份
mgr.BackupDatabase("Northwind", @"D:\Backups\Northwind_20240115.bak",
"Northwind_Full", "每日完整備份");
// 異地還原為新資料庫
var moveMap = new Dictionary
{
{ "Northwind", @"E:\SQLData\Northwind_Restore.mdf" },
{ "Northwind_log", @"F:\SQLLog\Northwind_Restore.ldf" }
};
mgr.RestoreDatabase("Northwind_Restore", @"D:\Backups\Northwind_20240115.bak",
moveFiles: moveMap);
| 維度 | SQL-DMO (COM) | T-SQL BACKUP/RESTORE |
|---|---|---|
| 程式設計介面 | 物件導向、型別安全、IntelliSense | 動態 SQL 字串、易注入、難除錯 |
| 非同步/進度回報 | 支援事件 (PercentComplete 等) | 需輪詢 sys.dm_exec_requests |
| 跨版本相容 | SQL 2000-2008 R2 (已淘汰) | 所有版本支援、語法穩定 |
| 部署相依性 | 需註冊 COM DLL、32/64 位元匹配 | 無額外相依、純 T-SQL |
| 進階選項控制 | 物件屬性直覺對應 | WITH 選項眾多、易拼錯 |
新專案請直接使用 Microsoft.SqlServer.Management.Smo (NuGet: Microsoft.SqlServer.SqlManagementObjects):
using Microsoft.SqlServer.Management.Smo;
using Microsoft.SqlServer.Management.Common;
var server = new Server(new ServerConnection("192.168.1.100", "sa", "pwd"));
var backup = new Backup
{
Action = BackupActionType.Database,
Database = "Northwind",
Devices = { new BackupDeviceItem(@"D:\Backups\Northwind.bak", DeviceType.File) },
Initialize = true,
Incremental = false
};
backup.SqlBackup(server);
| 錯誤訊息 | 原因 | 解決方案 |
|---|---|---|
| Class not registered (0x80040154) | sqldmo.dll 未註冊或 32/64 位元不符 | 以管理員執行 regsvr32、確認專案 Platform target (x86/x64) |
| Login failed for user | 認證錯誤、SQL Server 未啟用混合模式 | 檢查伺服器屬性→安全性→SQL Server and Windows Authentication |
| Backup device not found | 路徑錯誤、服務帳號無磁碟權限 | 使用 UNC 路徑、授予 SQL Server 服務帳號寫入權限 |
| Exclusive access could not be obtained | 資料庫有使用中連線 | 還原前設定 ALTER DATABASE SET SINGLE_USER WITH ROLLBACK IMMEDIATE |