Как вы можете отправить правильный объект даты и времени на SQL Server в powershell? - PullRequest
0 голосов
/ 23 декабря 2018

Я искал в интернете, и до сих пор ни один из ответов не дал ничего, что я смог использовать.

У меня серьезные проблемы получение простой даты-времени в базе данных SQL Server с powershell .

Столбецтипа "datetime" и язык en-US.

Пример значения столбца:

2009-09-16 00:00:00.000

Я пытался отправить эту же дату в базу данных в powershell, и все, что я пробуювернул ошибку

"Conversion failed when converting date and/or time from character string."

.

Это мой сценарий powershell:

$dateString = "2009-09-16 00:00:00.000"
$id = '12345'
$nd  = Get-Date $dateString -Format "yyyy-MM-dd HH:mm:ss:fff"
$query = "Update MyTable Set CreateDate = '@e1' Where ID = '@e2'"
$SqlCmd.Parameters.Clear()
$parm = $SqlCmd.Parameters.Add("@e1", $nd)
$SqlCmd.Parameters.Add("@e2" , $id)
$SqlCmd.CommandText = $query
$SqlCmd.ExecuteNonQuery()

Я пытался использовать [datetime] для переменной, но она всегда конвертируетсяна какую бы строку она ни смотрела, в отличие от необходимого формата, поэтому она не работает.

Все остальное, независимо от того, как оно выглядит правильно, не выполняется из-за неправильного типа.

Существует ли синтаксис, который получит то, что необходимо для вставки / обновления?

Ответы [ 2 ]

0 голосов
/ 23 декабря 2018
$param = $SqlCmd.Parameters.Add("@e1", $nd)

Add(String, Object) устарело . Не используйте этот метод , потому что система угадывает , какой тип данных использовать, и будет часто предполагать, что это строка.Вместо этого используйте Add(String, SqlDbType) или Add(String, SqlDbType, Int32) (последний - когда вам нужно указать длину, например, с помощью varchar(10)).

Здесь ябудет использовать это:

$SqlCmd.Parameters.Add("@e1", [System.Data.SqlDbType]::DateTime).Value = $nd
$SqlCmd.Parameters.Add("@e2", [System.Data.SqlDbType]::Int).Value = $id

Обратите внимание, что вы должны использовать фактический тип данных для второго значения здесь.Я просто предполагаю, что это int.System.Data.SqlDbType enum содержит типы данных для всех распространенных типов данных SQL Server.

Кроме того, ваш запрос неверен.Вы не хотите указывать параметры.Вместо этого:

$query = "Update MyTable Set CreateDate = '@e1' Where ID = '@e2'"

Укажите это:

$query = "Update MyTable Set CreateDate = @e1 Where ID = @e2"

Я бы также рекомендовал использовать более описательные имена параметров.Нет причин не использовать @CreateDate и @id.

Наконец, это вообще не возвращает дату и время, а просто возвращает другую строку:

$nd  = Get-Date $dateString -Format "yyyy-MM-dd HH:mm:ss:fff"

-Format параметр указывает формат вывода для строки.

Этот код я бы использовал:

$dateString = "2009-09-16 00:00:00.000"
$id = '12345'
$nd  = Get-Date $dateString

$ConnectionString = ...
$query = "Update MyTable Set CreateDate = @CreateDate Where ID = @id"
$SqlConnection = New-Object System.Data.SqlClient.SqlConnection -ArgumentList $ConnectionString
$SqlCmd = New-Object System.Data.SqlClient.SqlCommand -ArgumentList $query, $SqlConnection
$SqlCmd.Parameters.Add("@CreateDate", [System.Data.SqlDbType]::DateTime).Value = $nd
$SqlCmd.Parameters.Add("@id", [System.Data.SqlDbType]::Int).Value = $id

try {
    $SqlConnection.Open()
    $RecordsAffected = $SqlCmd.ExecuteNonQuery()
    Write-Host "$RecordsAffected row(s) updated."
}
finally {
    $SqlConnection.Close()
}
0 голосов
/ 23 декабря 2018

Hum, всегда опасен при поиске в базе данных с запросом, составленным с конкатенацией строк.Однако этот подход НЕ рекомендуется, потому что он подвержен атакам внедрения SQL.

Но вы можете попробовать это:

$query = "Update MyTable Set CreateDate = @e1 Where ID = '@e2'"
$SqlCmd.Parameters.Clear()
$SqlCmd.Parameters.Add("@e1", [System.Data.SqlDbType]::DateTime)
$param1.Value=(Get-Date -Year 2009 -Month 9 -Day 16 "yyyy-MM-dd HH:mm:ss:fff").Date
$SqlCmd.Parameters.Add("@e2" , $id)
$SqlCmd.CommandText = $query
$SqlCmd.ExecuteNonQuery()

или может быть так:

$id = '12345'
$dateString = "2009-09-16 00:00:00.000"
$query = "Update MyTable Set CreateDate = convert(datetime, '@e1', 121)  Where ID = '@e2'"
$SqlCmd.Parameters.Clear()
$SqlCmd.Parameters.Add("@e1", $dateString)
$SqlCmd.Parameters.Add("@e2" , $id)
$SqlCmd.CommandText = $query
$SqlCmd.ExecuteNonQuery()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...