Работа с нулевыми значениями в PSCustomObject из таблицы sql..Невозможно привести объект

#sql #powershell

#sql #powershell

Вопрос:

При извлечении данных из SQL некоторые столбцы в строке имеют значение null. Я получаю сообщение об исключении:

Исключение, вызывающее «getString» с аргументами «1»: «Невозможно привести объект типа ‘System.DBNull’ в тип ‘System.Строка’.»

Как я могу справиться с этим? Кажется, в основном это просто переход к следующей строке, но мне нужны все строки и все столбцы. Если столбец имеет значение null, я согласен, но, я думаю, мне нужно установить его как пустую строку. Эти данные будут использоваться для настройки сведений о пользователях в AD. Когда я использую Set-ADUser команду, мне нужно будет иметь возможность использовать переменную, даже если она равна null. Я не хочу, чтобы PowerShell не выполнял Set-ADUser команду, потому что конкретная переменная пуста. Тот, на котором он чаще всего терпит неудачу, — это supr_username .

Мне потребовалось много времени , чтобы получить выходные данные из таблицы Oracle sql , чтобы я мог использовать их для Set-ADUser . Я еще не нашел ничего, что могло бы сделать то, что я пытаюсь сделать.

  [pscustomobject]@{
 Identity = $_.GetString(2)
 Title = $_.GetString(3)
 Department = $_.GetString(4)
 MSC = $_.GetString(5)
 Office_Location = $_.GetString(6)
 Office_Phone = $_.GetString(7)
 Supr_username = $_.GetString(10)
 }
 }````


 

Комментарии:

1. О каком количестве пользователей мы здесь говорим? Если это не огромное число, вы можете сохранить выходные данные из базы данных в списке и выполнить if-оператор перед запуском Set-ADUser, заменив любые нулевые значения чем-то другим. Трудно сказать, как именно я бы это сделал в этом случае, не видя больше вашего кода.

Ответ №1:

Вы можете инициализировать свои пользовательские свойства объекта значениями пустой строки ( "" ). Затем вы можете проверить, содержит ли индекс столбца (порядковый номер) a DBNull , и преобразовать в строку, если это не DBNULL так.

 $obj = [pscustomobject][ordered]@{Identity = ""
    Title = ""
    Department = ""
    MSC = ""
    Office_Location = ""
    Office_Phone = ""
    Supr_username = ""
    }

$obj.Identity = if (!$_.isDbNull(2)) { $_.GetString(2) }
$obj.Title = if (!$_.isDbNull(3)) { $_.GetString(3) }
$obj.Department = if (!$_.isDbNull(4)) { $_.GetString(4) }
$obj.MSC = if (!$_.isDbNull(5)) { $_.GetString(5) }
$obj.Office_Location = if (!$_.isDbNull(6)) { $_.GetString(6) }
$obj.Office_Phone = if (!$_.isDbNull(7)) { $_.GetString(7) }
$obj.Supr_username = if (!$_.isDbNull(10)) { $_.GetString(10) }

$obj
 

Комментарии:

1. Спасибо! В итоге я сделал это во время чтения таблицы (до того, как увидел ваш пост): if ($SelectDataTable . IsDBNUll(2)) {$Identity = «none»} else {$Identity = $selectdatable . getString(2)} …. После просмотра переменных я запускаю set-aduser… Я думаю, у меня около 1000 пользователей. Эффективно ли это по-моему? Думаю, я это измерю. Я хочу поместить код здесь, но недостаточно места в качестве комментария?

2. @bvi1998 Я не думаю, что ваш способ менее эффективен, чем мой.