Запрос SQL с ошибкой c # stringbuilder рядом с символом "=" - PullRequest
0 голосов
/ 04 июля 2018

Я работаю над кодом, который создает процедуры с C #. Когда я пытаюсь запустить свой код:

StringBuilder sbSP1 = new StringBuilder();

sbSP1.AppendLine("CREATE PROCEDURE " + ProcN + "DELETE @id int=0 AS BEGIN DELETE FROM " + tname + " WHERE " + PK + " = @id END");

SqlConnection connection = new SqlConnection(connectionString);

using (SqlCommand cmd = new SqlCommand(sbSP1.ToString(), connection))
{
    connection.Open();
    cmd.CommandType = CommandType.Text;
    cmd.ExecuteNonQuery();
    connection.Close();
}

Эта часть не работает . Выдает исключение:

System.Data.SqlClient.SqlException: 'Неверный синтаксис рядом с' = '.'

Но когда я пытаюсь запустить эту часть:

StringBuilder sbSP3 = new StringBuilder();
sbSP3.AppendLine("CREATE PROCEDURE " + ProcN + "GET AS BEGIN SET NOCOUNT ON; SELECT " + columns + " from " + tname + "  END");

SqlConnection connection = new SqlConnection(connectionString);

using (SqlCommand cmd = new SqlCommand(sbSP3.ToString(), connection))
{
    connection.Open();
    cmd.CommandType = CommandType.Text;
    cmd.ExecuteNonQuery();
    connection.Close();
}

работает правильно.

Где моя ошибка в первом фрагменте кода?

1 Ответ

0 голосов
/ 04 июля 2018

Без sbSP1 окончательный текст Трудно определить ошибку; в качестве рабочей гипотезы я предлагаю, чтобы PK был сложным (например, "id value") должно быть экранировано - [PK]. Чтобы избежать ошибок такого рода, никогда не создайте запрос, а сделайте текст процедуры , который будет читабельным с помощью интерполяции строк - $ и дословные строки - @.

 //TODO: check the text, is it the procedure you want to create?
 string text = 
   $@"create procedure [{ProcN}Delete] 
        @id int = 0 as 
      begin
        delete
          from [{tname}]
         where [{PK}] = @id 
      end;"; 

 //DONE: do not close connection manually, but wrap it into using
 using (SqlConnection connection = new SqlConnection(connectionString)) {
   connection.Open();

   using (qlCommand cmd = new SqlCommand(text, connection)) {
     cmd.ExecuteNonQuery();
   }  
 }  
...