2014-09-03 4 views
1

Я запускаю запрос из веб-формы для обновления записей. Поскольку я только что узнал о C#, я использую командную строку, а не хранимую процедуру.Ошибка синтаксиса SQL в строке C#

Мой метод обновления выглядит следующим образом:

public void updateOne() 
    { 
     string commandText = "update INVOICE SET <Redacted> = @<Redacted>, 
        Supplier = @Sup, SupplierName = @SupN, NetTotal = @Net, 
           VATTotal = @VAT, InvoiceDate = @InvDt " 
     <needed a line break here, which is why I split the string again> 
           + "WHERE K_INVOICE = @K_INV"; 

     using (SqlConnection dbConnection = new SqlConnection 
                (conParams.connectionString)) 
     { 
      SqlCommand cmd = new SqlCommand(commandText, dbConnection); 
      cmd.Parameters.Add("@K_INV", SqlDbType.Int); 
      cmd.Parameters["@K_INV"].Value = @K_INV; 

      cmd.Parameters.AddWithValue("@<Redacted>", @<Redacted>.ToString()); 
      cmd.Parameters.AddWithValue("@Sup", @Sup.ToString()); 
      cmd.Parameters.AddWithValue("@SupN", @SupN.ToString()); 
      cmd.Parameters.AddWithValue("@Net", @Net.ToString()); 
      cmd.Parameters.AddWithValue("VAT", @VAT.ToString()); 
      cmd.Parameters.AddWithValue("@InvDt", @InvDt.ToString()); 

      try 
      { 
       dbConnection.Open(); 
       cmd.ExecuteNonQuery(); 
      } 
      catch (Exception e) 
      { 
       errorString = e.Message.ToString(); 
      } 
     } 
    } 

Catch киосков на ошибки SQL (Неправильный синтаксис около SET), и у меня есть идея о том, что проблема возникает потому, что преобразования параметров в строки. Первый параметр - Int, который должен быть в порядке.

Если это так, нужно ли преобразовать параметры в? Если нет, что на самом деле неправильно?

+2

Является ли ваше имя столбца '' содержит '<>', что может быть проблемы в вашем запросе. – Habib

+1

вам не нужен символ '@' Literal в вашем втором параметре для addwithvalue. что '< >' используется в вашем Param ..? – MethodMan

+0

@Habib no, это заполнитель, так как имя столбца может идентифицировать мою организацию – Wolfish

ответ

1

Я рекомендовал бы прочитать эту статью блога о вреде .AddWithValue():

Вместо

cmd.Parameters.AddWithValue("@Sup", @Sup.ToString()); 

вы должны использовать

cmd.Parameters.Add("@Sup", SqlDbType.VarChar, 50).Value = ...(provide value here)..; 

(- Ваша переменная в C# действительно называется @SupN ?? Довольно необычно и запутанным ....)

Я бы рекомендовал всегда определить явную длину для любых строковых параметров вы определяете

+1

В той же строке: [Как код доступа к данным влияет на производительность базы данных] (http://msdn.microsoft.com/en-us/magazine/ee236412.aspx) – Steve

3

Попробуйте добавить @ перед строкой в ​​escape the breaklines для образца:

string commandText = @"update INVOICE SET [Redacted] = @Redacted, 
        Supplier = @Sup, SupplierName = @SupN, NetTotal = @Net, 
           VATTotal = @VAT, InvoiceDate = @InvDt " 
           + "WHERE K_INVOICE = @K_INV"; 

В ParameterName аргумента можно добавить @, но значение не, только переменную, для образца

cmd.Parameters.AddWithValue("@Redacted", redacted.ToString()); 

Попробуйте выполнить этот запрос в файле данных с некоторыми значениями, чтобы проверить, все ли правильно. Вы можете использовать [brackets] в имени таблицы и имени столбца, если у вас есть зарезервированное слово.

+0

У меня теперь нет ошибки, но запись не сохраняется. Может ли это быть чем-то связанным с данными сеанса? – Wolfish

+0

Кстати, мне нужно удалить сегменты, которые я редактировал, так как они потенциально могут идентифицировать организацию, в которой я участвую в обучении – Wolfish

+1

Взгляните на мои правки :) –

Смежные вопросы