#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 Я не думаю, что ваш способ менее эффективен, чем мой.