没有映射存在objecttype:Arraylist到本机类型

时间:2017-08-21 12:35:05

标签: sql-server-2008 powershell arraylist

我有一个充满来自cmdlet(来自BEMCLI模块)的数据的arraylist,并希望将数据存储在数据库中。声明每一列只是为了指定错误。

有一些关于类似错误代码的问题,但我不知道如何让解决方案适合我。

错误码:

No mapping exists from object type System.Data.Arraylist to a known managed
provider native type
In C:\**\test.ps1:68 Zeichen:1
+ $SqlCmd.executenonquery()
+ ~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : ArgumentException

脚本:

$JobHistory = Invoke-Command -ComputerName $ServerName -ScriptBlock {
    Import-Module BEMCLI;
    Get-BEJobHistory -FromStartTime (Get-Date).AddDays(-1)
}

$SqlCmd = New-Object System.Data.SqlClient.SqlCommand
$SqlConnection = New-Object System.Data.SqlClient.SqlConnection
$SqlConnection.ConnectionString = "Server = $SQLServer; Database = $SQLDBName; Integrated Security = True;"
$SqlConnection.Open()

for ($i=0; $i -lt $JobHistory.Length; $i++) {
    $SqlCmd.Parameters.Add("@Name", [System.Data.SqlDbType]::string).Value = $JobHistory[$i].Name
    $SqlCmd.Parameters.Add("@ID", [System.Data.SqlDbType]::UniqueIdentifier).Value = $JobHistory[$i].ID
    $SqlCmd.Parameters.Add("@JobName", [System.Data.SqlDbType]::String).Value = $JobHistory[$i].JobName
    $SqlCmd.Parameters.Add("@JobStatus", [System.Data.SqlDbType]::String).Value = $JobHistory[$i].JobStatus
    $SqlCmd.Parameters.Add("@Job", [System.Data.SqlDbType]::String).Value = $JobHistory[$i].Job
    $SqlCmd.Parameters.Add("@JobId", [System.Data.SqlDbType]::UniqueIdentifier).Value = $JobHistory[$i].JobId
    $SqlCmd.Parameters.Add("@JobType", [System.Data.SqlDbType]::String).Value = $JobHistory[$i].JobType
    $SqlCmd.Parameters.Add("@StartTime", [System.Data.SqlDbType]::DateTime).Value = $JobHistory[$i].StartTime
    $SqlCmd.Parameters.Add("@ElapsedTime", [System.Data.SqlDbType]::TimeSpan).Value = $JobHistory[$i].ElapsedTime
    $SqlCmd.Parameters.Add("@EndTime", [System.Data.SqlDbType]::DateTime).Value = $JobHistory[$i].EndTime
    $SqlCmd.Parameters.Add("@PercentComplete", [System.Data.SqlDbType]::Real).Value = $JobHistory[$i].PercentComplete
    $SqlCmd.Parameters.Add("@AgentServer", [System.Data.SqlDbType]::String).Value = $JobHistory[$i].AgentServer
    $SqlCmd.Parameters.Add("@AgentServerIdList", [System.Data.SqlDbType]::String).Value = $JobHistory[$i].AgentServerIdList
    $SqlCmd.Parameters.Add("@BackupExecServerName", [System.Data.SqlDbType]::String).Value = $JobHistory[$i].JobLogFilePath
    $SqlCmd.Parameters.Add("@JobLogFilePath", [System.Data.SqlDbType]::String).Value = $JobHistory[$i].JobLogFilePath
    $SqlCmd.Parameters.Add("@DeduplicationRatio", [System.Data.SqlDbType]::Real).Value = $JobHistory[$i].DeduplicationRatio
    $SqlCmd.Parameters.Add("@JobRateMBPerMinute", [System.Data.SqlDbType]::Real).Value = $JobHistory[$i].JobRateMBPerMinute
    $SqlCmd.Parameters.Add("@StorageName", [System.Data.SqlDbType]::String).Value = $JobHistory[$i].StorageName
    $SqlCmd.Parameters.Add("@TotalDataSizeBytes", [System.Data.SqlDbType]::BigInt).Value = $JobHistory[$i].TotalDataSizeBytes
    $SqlCmd.Parameters.Add("@ErrorCategory", [System.Data.SqlDbType]::Int).Value = $JobHistory[$i].ErrorCategory
    $SqlCmd.Parameters.Add("@ErrorCode", [System.Data.SqlDbType]::Int).Value = $JobHistory[$i].ErrorCode
    $SqlCmd.Parameters.Add("@ErrorCategory", [System.Data.SqlDbType]::String).Value = $JobHistory[$i].ErrorCategory
    $SqlCmd.Parameters.Add("@ErrorMessage", [System.Data.SqlDbType]::Int).Value = $JobHistory[$i].ErrorMessage

    $SqlQuery = "INSERT INTO JobHistory(Nr,Name,ID,JobName,JobStatus,Job,JobId,JobType,StartTime,ElapsedTime,EndTime,PercentComplete,AgentServer,AgentServerIdList,BackupExecServerName,JobLogFilePath,DeduplicationRatio,JobRateMBPerMinute,StorageName,TotalDataSizeBytes,ErrorCategory,ErrorCode,ErrorCategory,ErrorMessage) VALUES (@Nr,@Name,@ID,@JobName,@JobStatus,@Job,@JobId,@JobType,@StartTime,@ElapsedTime,@EndTime,@PercentComplete,@AgentServer,@AgentServerIdList,@BackupExecServerName,@JobLogFilePath,@DeduplicationRatio,@JobRateMBPerMinute,@StorageName,@TotalDataSizeBytes,@ErrorCategory,@ErrorCode,@ErrorCategory,@ErrorMessage)"

    $SqlCmd.CommandText = $SqlQuery
    $SqlCmd.Connection = $SqlConnection

    $SqlCmd.ExecuteNonQuery()
}

1 个答案:

答案 0 :(得分:0)

感谢理查德提供正确的提示。 收藏集会导致问题(AgentServerAgentServerIdList

我修复了上面的代码,在循环中添加$SqlCmd.Parameters.Clear()以清除每个循环中的参数。这就像'cannot declare @Variable twice'。

Commandline给了我另一个错误 - 所以我决定切换到.Parameters.AddWithValue - Command。

脚本现在运行正常。谢谢!

$JobHistory = invoke-command -ComputerName $ServerName -ScriptBlock { import-module BEMCLI; Get-BEJobHistory -FromStartTime (get-date).AddDays(-1) }

$SqlCmd = New-Object System.Data.SqlClient.SqlCommand
$SqlConnection = New-Object System.Data.SqlClient.SqlConnection
$SqlConnection.ConnectionString = "Server = $SQLServer; Database = $SQLDBName; Integrated Security = True;"
$SqlCmd.Connection = $SqlConnection
$SqlConnection.Open()

for($i=0; $i -lt $JobHistory.Length; $i++){

$SqlCmd.Parameters.Clear()

$SqlCmd.Parameters.AddWithValue("@Nr", $JobHistory[$i].Nr)
$SqlCmd.Parameters.AddWithValue("@Name",$JobHistory[$i].Name)
$SqlCmd.Parameters.AddWithValue("@ID", $JobHistory[$i].ID)
$SqlCmd.Parameters.AddWithValue("@JobName", $JobHistory[$i].JobName)
$SqlCmd.Parameters.AddWithValue("@JobStatus", $JobHistory[$i].JobStatus)
$SqlCmd.Parameters.AddWithValue("@Job", $JobHistory[$i].Job)
$SqlCmd.Parameters.AddWithValue("@JobId", $JobHistory[$i].JobId)
$SqlCmd.Parameters.AddWithValue("@JobType", $JobHistory[$i].JobType)
$SqlCmd.Parameters.AddWithValue("@StartTime", $JobHistory[$i].StartTime)
$SqlCmd.Parameters.AddWithValue("@ElapsedTime", $JobHistory[$i].ElapsedTime)
$SqlCmd.Parameters.AddWithValue("@EndTime", $JobHistory[$i].EndTime)
$SqlCmd.Parameters.AddWithValue("@PercentComplete", $JobHistory[$i].PercentComplete)
$SqlCmd.Parameters.AddWithValue("@BackupExecServerName", $JobHistory[$i].BackupExecServerName)
$SqlCmd.Parameters.AddWithValue("@JobLogFilePath", $JobHistory[$i].JobLogFilePath)
$SqlCmd.Parameters.AddWithValue("@DeduplicationRatio", $JobHistory[$i].DeduplicationRatio)
$SqlCmd.Parameters.AddWithValue("@JobRateMBPerMinute", $JobHistory[$i].JobRateMBPerMinute) 
$SqlCmd.Parameters.AddWithValue("@StorageName", $JobHistory[$i].StorageName)
$SqlCmd.Parameters.AddWithValue("@TotalDataSizeBytes", $JobHistory[$i].TotalDataSizeBytes)            
$SqlCmd.Parameters.AddWithValue("@ErrorCode", $JobHistory[$i].ErrorCode)
$SqlCmd.Parameters.AddWithValue("@ErrorCategory", $JobHistory[$i].ErrorCategory)
$SqlCmd.Parameters.AddWithValue("@ErrorCategoryType", $JobHistory[$i].ErrorCategoryType)
$SqlCmd.Parameters.AddWithValue("@ErrorMessage", $ValueForJobHistory[$i].ErrorMessage)
$SqlQuery = "Insert into JobHistory(Nr,Name,ID,JobName,JobStatus,Job,JobId,JobType,StartTime,ElapsedTime,EndTime,PercentComplete,BackupExecServerName,JobLogFilePath,DeduplicationRatio,JobRateMBPerMinute,StorageName,TotalDataSizeBytes,ErrorCode,ErrorCategory,ErrorCategoryType) Values(@Nr,@Name,@ID,@JobName,@JobStatus,@Job,@JobId,@JobType,@StartTime,@ElapsedTime,@EndTime,@PercentComplete,@BackupExecServerName,@JobLogFilePath,@DeduplicationRatio,@JobRateMBPerMinute,@StorageName,@TotalDataSizeBytes,@ErrorCode,@ErrorCategoryType,@ErrorCategory)"

$SqlCmd.CommandText = $SqlQuery
$SqlCmd.executenonquery()
}