2015-05-05 53 views
0

我完全被這個困惑。我正在嘗試使用SMO程序集編寫一個簡單的數據庫恢復腳本。當試圖使用SMO.Backup.AddDevice Powershell引發轉換異常

當我嘗試添加設備,並傳遞路徑,像這樣:

$backup.Devices.AddDevice($path, [Microsoft.SqlServer.Management.Smo.DeviceType]::File) 

我得到一個奇怪的例外:

Cannot convert argument "1", with value: "File", for "AddDevice" to type "Microsoft.SqlServer.Management.Smo.DeviceType": "Cannot convert value "File" to type "Microsoft.SqlServer.Management.Smo.DeviceType". Error: "Invalid cast from 'Microsoft.SqlServer.Mana gement.Smo.DeviceType' to 'Microsoft.SqlServer.Management.Smo.DeviceType'."" At D\Automatisk inläsning\AutoImportPowershell.ps1:41 char:26 + $backup.Devices.AddDevice <<<< ($path, [Microsoft.SqlServer.Management.Smo.DeviceType]::File) + CategoryInfo : NotSpecified: (:) [], MethodException + FullyQualifiedErrorId : MethodArgumentConversionInvalidCastArgument

下面是完整的腳本:

#ASSEMBLIES: 
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SMO") | Out-Null 
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SmoExtended") | Out-Null 
[Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.ConnectionInfo") | Out-Null 
[Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SmoEnum") | Out-Null 

#HARDCODED VARIABLES: 
$path = "C:\TestFolder\Bakfile.bak" 
$server = "(local)" 
$databas = "MyDatabase" 

#SMO OBJECTS: 
$srv = new-object Microsoft.SqlServer.Management.Smo.Server($server) 
$res = new-object Microsoft.SqlServer.Management.Smo.Restore 
$backup = new-object Microsoft.SqlServer.Management.Smo.Backup 

#STARTING RESTORE: 
$backup.Devices.AddDevice($path, [Microsoft.SqlServer.Management.Smo.DeviceType]::File) 
$backup.Database = $databas 
$backup.Action = [Microsoft.SqlServer.Management.Smo.BackupActionType]::Database 
$backup.Initialize = $TRUE 
$backup.SqlBackup($srv) 

$res.Devices.AddDevice($path, [Microsoft.SqlServer.Management.Smo.DeviceType]::File) 
$res.Database = $databas 
$res.NoRecovery = $TRUE 
$res.SqlRestore($srv) 

讓我困惑的是錯誤信息本身'Microsoft.SqlServer.Mana gement.Smo.DeviceType'改爲'Microsoft.SqlServer.Management.Smo.DeviceType'。這些聽起來像我一樣的類型!

回答

1

你可以測試並補充說:

Add-Type -AssemblyName Microsoft.SqlServer.Management.Common 
Add-Type -AssemblyName Microsoft.SqlServer.Management.Smo 

在你#ASSEMBLIES:組結束。

然後更換:

$backup.Devices.AddDevice($path, [Microsoft.SqlServer.Management.Smo.DeviceType]::File) 

$bdi = new-object Microsoft.SqlServer.Management.Smo.BackupDeviceItem($path, [Microsoft.SqlServer.Management.Smo.DeviceType]::File) 
$backup.Devices.Add($bdi) 

BackupDeviceItem

+0

謝謝你的提示!它現在工作!但是,我相信這是因爲我嘗試運行具有管理權限的ISE ... – user1531921

+0

奇怪的是,缺少權限會生成該類型的錯誤。現在我有一個新的隱患錯誤「備份服務器失敗」。沒有更多信息。類型是MethodInvocationException – user1531921

+0

也許爲更好的受衆創建一個新問題。 – JPBlanc