我不知道您可以通过 VB6 访问 SMO 的方法。我同意 G Mastros 关于使用 COM/Interop 方法直接实现 .NET 代码的观点。
要考虑的替代方法是您可以使用 Powershell,执行一个脚本来完成您的 .NET SMO 工作。您仍然有需要 .NET 框架(显然还有 Powershell)的先决条件,但它可以完成工作。您的脚本可以采用凭据、数据库名称、备份类型等参数。
我在拥有 SQL Express(没有用于备份的 SQL 代理,如 MSDE)的客户端上实现了很多。我连接了一个计划任务,它调用脚本并管理他们的备份。
如果有帮助,这里有一个脚本——大部分是被盗的,但我对其进行了一些修改:
param (
[string] $ServerName,
[string] $DatabaseName,
[string] $Backuptype,
[string] $BackupPath,
[int] $NumDays
)
Get-ChildItem $BackupPath | where {$_.LastWriteTime -le (Get-Date).AddDays(-$NumDays)} | remove-item
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.Smo") | out-null
[System.IO.Directory]::CreateDirectory($BackupPath) | out-null
$srv=New-Object "Microsoft.SqlServer.Management.Smo.Server" "$servername"
$bck=new-object "Microsoft.SqlServer.Management.Smo.Backup"
if ($Backuptype -eq "FULL")
{
$bck.Action = 'Database'
$extenstion=".BAK"
$text1="Full Backup"
}
if ($Backuptype -eq "TRAN")
{
$bck.Action = 'Log'
$bck.LogTruncation = 2
$extenstion=".TRN"
$text1="Transactional Log Backup"
}
if ($Backuptype -eq "DIFF")
{
$bck.Incremental = 1
$extenstion=".DIFF"
$text1="Differential Backup"
}
$fil=new-object "Microsoft.SqlServer.Management.Smo.BackupDeviceItem"
$fil.DeviceType='File'
$fil.Name=[System.IO.Path]::Combine($BackupPath, $DatabaseName+ "_"+ [DateTime]::Now.ToString("yyyy_MM_dd_HH_mm")+$extenstion)
$bck.Devices.Add($fil)
$bck.Database=$DatabaseName
$bck.SqlBackup($srv)
write-host $text1 of $Databasename done
它可以进行完整备份、差异备份和事务备份,并根据日期和时间对每个生成的文件进行唯一命名,删除超过一定天数的所有文件。
调用它的语法是:
.\Backup.ps1 INSTANCENAME DATABASENAME FULL|TRAN|DIFF PATH DAYSTOKEEP
所以...
.\Backup.ps1 SQLEXPRESS Northwind FULL C:\TempHold\Test 30
.\Backup.ps1 SQLEXPRESS Northwind TRAN C:\TempHold\Test 30
.\Backup.ps1 SQLEXPRESS Northwind DIFF C:\TempHold\Test 30
要在任务计划程序中进行计划,请传入:
powershell c:\temphold\test\backup.ps1 "SQLEXPRESS Northwind DIFF C:\TempHold\Test 30"