Исключение, вызывающее «ExecuteNonQuery» с аргументами «0»

#sql-server #powershell

#sql-сервер #powershell

Вопрос:

У меня проблема с моим сценарием powershell. Мне нужна вставка в базу данных mssql.

Я получаю:

Исключение, вызывающее «ExecuteNonQuery» с аргументами «0»: «Неправильный синтаксис около ’00′». В C:powershellImportPism.ps1:259 символ: 9 $ SqlCmd.ExecuteNonQuery() ~~~~~~~~~~~~~~~~~~~~~~~~~ CategoryInfo : не указано: (:) [], исключение MethodInvocationException FullyQualifiedErrorId : SQLException

Вот мой код:

 $sql = "
     INSERT INTO [dbo].[akcja]
       ([ak_akt_id]
       ,[ak_sp_id]
       ,[ak_kolejnosc]
       ,[ak_interwal]
       ,[ak_zakonczono]
       ,[ak_sc_id]
       ,[ak_pr_id])
 VALUES
       (
       $($item.akt_id)
       ,$($item.sp_id)
       ,0
       ,0
       ,$($item.data_dodania)
       ,NULL
       ,NULL)
select SCOPE_IDENTITY() as [InsertedId]
     " 
$SqlConnection = New-Object System.Data.SqlClient.SqlConnection
$SqlConnection.ConnectionString = "Server = $SQLServer; Database =       $SQLDBName; User Id=$login; Password=$password; Integrated Security =     false";
    $SqlCmd = New-Object System.Data.SqlClient.SqlCommand
    $SqlCmd.CommandText = $sql
    $SqlCmd.Connection = $sqlConnection
    $SqlConnection.Open()
    $InsertedId = $SqlCmd.ExecuteScalar()      

    $SqlConnection.Close()
  

Почему это не работает?

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

1. Очевидно, потому что в вашем SQL есть синтаксическая ошибка после замены строки. Невозможно точно сказать, что, не видя результата. Используйте параметры вместо текстовой замены значений в инструкции. Замена строк выглядит удобной, пока вы не столкнетесь с подобными проблемами (или, что еще хуже, SQL-инъекцией).

2. Правильное выполнение SQL в PowerShell

3. Спасибо @Jeroen Mostert. Я использую параметры и все в порядке 😉

Ответ №1:

Я получил эту ошибку, когда не заключил параметры даты и времени в одинарные кавычки.

Например. убедитесь, что вы добавили кавычки в строку.формат

Строка.Формат («ВСТАВИТЬ В [dbo].tbl ЗНАЧЕНИЯ ({0})

ВСТАВИТЬ В [dbo].tbl ЗНАЧЕНИЯ (0001-01-01 00:00:00.000)

необходимо быть:

Строка.Формат («ВСТАВИТЬ В [dbo].tbl ЗНАЧЕНИЯ (‘{0}’)

ВСТАВИТЬ В [dbo].ЗНАЧЕНИЯ tbl (‘0001-01-01 00:00:00.000’)