$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()
}