【问题标题】:Powershell throws conversion exception when trying to use SMO.Backup.AddDevicePowershell 尝试使用 SMO.Backup.AddDevice 时抛出转换异常
【发布时间】:2015-05-05 08:34:25
【问题描述】:

我完全被这个弄糊涂了。我正在尝试使用 SMO 程序集编写一个简单的数据库还原脚本。

当我尝试添加设备并传递路径时,如下所示:

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

我得到一个奇怪的例外:

无法将参数“1”,值为:“File”,将“AddDevice”转换为“Microsoft.SqlServer.Management.Smo.DeviceType”:“无法将值“File”转换为“Microsoft.SqlServer.Management” .Smo.DeviceType”。错误:“来自 'Microsoft.SqlServer.Mana 的无效转换 gement.Smo.DeviceType' 到 'Microsoft.SqlServer.Management.Smo.DeviceType'。"" 在 D\Automatisk inläsning\AutoImportPowershell.ps1:41 char:26 + $backup.Devices.AddDevice

这是完整的脚本:

#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)

让我感到困惑的是错误消息本身 Invalid cast from 'Microsoft.SqlServer.Mana gement.Smo.DeviceType”到“Microsoft.SqlServer.Management.Smo.DeviceType”。对我来说,这些听起来像是同一类型!

【问题讨论】:

    标签: sql powershell type-conversion smo database-restore


    【解决方案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)
    

    备份设备项

    【讨论】:

    • 感谢您的提示!现在可以了!但是,我相信这是因为我尝试使用管理权限运行 ISE...
    • 奇怪的是缺少权限会产生这种类型的错误。现在我有一个新的模棱两可的错误“服务器 的备份失败”。没有进一步的信息。类型为 MethodInvocationException
    • 也许可以为更好的受众创建一个新问题。
    • 我已接受您的正确回答,因为我的原始问题已解决。再次感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-23
    • 2015-07-16
    • 2018-06-22
    • 1970-01-01
    • 1970-01-01
    • 2012-09-23
    • 1970-01-01
    相关资源
    最近更新 更多