Ошибка Powershell. WriteToServer. столбец не позволяет DBNull.Value - PullRequest
1 голос
/ 29 октября 2019

Я использую следующий сценарий powershell для сбора информации о хранилище сервера с нескольких серверов и в таблицу SQL Server. Я получаю сообщение об ошибке при выполнении следующего сценария powershell

Ошибка: -

Исключение, вызывающее «WriteToServer» с аргументом «1»: «Столбец« имя_сервера »не разрешаетDBNull.Value.

Таблица содержит только один столбец со всеми именами серверов. Сценарий Powershell извлекает имя сервера из таблицы базы данных и собирает информацию о хранилище сервера. Он работает на нескольких серверах, но не работает на нескольких серверах. с вышеуказанной ошибкой.

Table 
CREATE TABLE [dbo].[server_space_lku](
    [server_name] [varchar](50) NOT NULL,
 CONSTRAINT [PK_server_lku] PRIMARY KEY CLUSTERED)

Я использую следующий скрипт powershell. Как я могу исправить проблему?

    param($destServer, $destDb)

function Get-SqlData
{
    param([string]$serverName=$(throw 'serverName is required.'), [string]$databaseName=$(throw 'databaseName is required.'),
          [string]$query=$(throw 'query is required.'))

    Write-Verbose "Get-SqlData serverName:$serverName databaseName:$databaseName query:$query"

    $connString = "Server=$serverName;Database=$databaseName;Integrated Security=SSPI;"
    $da = New-Object "System.Data.SqlClient.SqlDataAdapter" ($query,$connString)
    $dt = New-Object "System.Data.DataTable"
    [void]$da.fill($dt)
    $dt

} #Get-SqlData


function Get-Vol
{
    param($computerName)

    Get-WmiObject -computername "$ComputerName" Win32_Volume -filter "DriveType=3 AND SystemVolume = $false" | 
    foreach { add-member -in $_ -membertype noteproperty UsageDT $((Get-Date).ToString("yyyy-MM-dd"))
              add-member -in $_ -membertype noteproperty SizeGB $([math]::round(($_.Capacity/1GB),2))
              add-member -in $_ -membertype noteproperty FreeGB $([math]::round(($_.FreeSpace/1GB),2))
              add-member -in $_ -membertype noteproperty PercentFree $([math]::round((([float]$_.FreeSpace/[float]$_.Capacity) * 100),2)) -passThru} |
    select UsageDT, SystemName, Name, Label, SizeGB, FreeGB, PercentFree

}# Get-Vol




function Out-DataTable 
{
    param($Properties="*")
    Begin
    {
        $dt = new-object Data.datatable  
        $First = $true 
    }
    Process
    {
        $DR = $DT.NewRow()  
        foreach ($item in $_ |  Get-Member -type *Property $Properties ) {  
          $name = $item.Name
          if ($first) {  
            $Col =  new-object Data.DataColumn  
            $Col.ColumnName = $name
            $DT.Columns.Add($Col)
          }  
            $DR.Item($name) = $_.$name  
        }  
        $DT.Rows.Add($DR)  
        $First = $false  
    }
    End
    {
        return @(,($dt))
    }

}# Out-DataTable 


function Write-DataTableToDatabase
{ 
    param($destServer,$destDb,$destTbl,$dt)

    $connectionString = "Data Source=$destServer;Integrated Security=true;Initial Catalog=$destdb;"
    $bulkCopy = new-object ("Data.SqlClient.SqlBulkCopy") $connectionString
    $bulkCopy.DestinationTableName = "$destTbl"
    $bulkCopy.WriteToServer($dt)

}# Write-DataTableToDatabase


Get-SqlData $destServer $destDb  "SELECT server_name FROM server_space_lku" |
foreach {
            #Get just the server name portion if instance name is included
            $computerName = $_.server_name -replace "\\.*|,.*"
            $dt = Get-Vol $computerName | Out-DataTable
            Write-DataTableToDatabase $destServer $destDb 'vol_space' $dt
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...