2015-09-25 2 views
1

В моем классе SqlClient я внедрил метод Insert таким образом. Я должен передать Dictionary с парами (имя столбца, значение) до Insert, а затем метод строит параметризованный запрос и выполняет команду.Клиент C# Sql - не может Вставить параметризованный столбец, имя которого начинается с номера

public void Insert(string table, Dictionary<string, object> values) 
    { 
     // build INSERT query 
     string query = "INSERT INTO " + table + " ("; 

     foreach (KeyValuePair<string, object> pair in values) 
      query += pair.Key + ","; 

     query = query.Substring(0, query.Length - 1) + ")"; 
     query += "VALUES ("; 

     foreach (KeyValuePair<string, object> pair in values) 
      query += "@" + pair.Key + ","; 

     query = query.Substring(0, query.Length - 1) + ")"; 

     // create command from query 
     using (SqlCommand command = new SqlCommand(query, connect)) 
     { 
      foreach (KeyValuePair<string, object> pair in values) 
       command.Parameters.Add(pair.Key, pair.Value); 

      // execute command 
      command.ExecuteNonQuery(); 
     } 
    } 

Но, я обнаружил, что не работает, а в значениях список некоторых столбец, название которого начинается с числа, например 1column. (Я знаю, что это ужасное имя переменной, сообщите об этом владельцу базы данных). Можете ли вы предложить мне каким-то образом, как заставить его работать? Кроме того, вы определенно найдете мой способ построения запросов не идеальным, поэтому я буду благодарен за любые комментарии.

EDIT:

  • Ближайшие имя столбца с двойными кавычками ("1column") не помогает.

ответ

1

окружать имя столбца со скобками, например, [1column].

string query = "INSERT INTO " + table + " ("; 

    foreach (KeyValuePair<string, object> pair in values) 
     query += "[" + pair.Key + "],"; 
+0

К сожалению, это не помогает, см. Мое редактирование. – Majak

+0

Я тебе не верю. Пожалуйста, покажите команду SQL после внесения изменений. –

+0

Ричард, мне очень жаль. Я сделал небольшую ошибку. Теперь это работает. Большое спасибо! – Majak

0

Я бы убеждается, что при вызове колонки обижая, она окружена «»

И.Е. «1column»

Возможно, что движок sql видит его как два отдельных объекта, как в 1 и столбце.

UPDATE:

Вы пробовали изменения

command.Parameters.Add(pair.Key, pair.Value); 

для

command.Parameters.AddWithValue(pair.Key, pair.Value); 
+0

К сожалению, это не помогает, я пробовал это. – Majak

+0

Да, я тоже это пробовал. – Majak

+0

В таком случае я бы сделал то, что предложил Ричард, вывести строку своей команды в окно сообщения, чтобы вы могли проверить, что она генерирует правильную строку. –

1

Двойные кавычки не имеют особых значений в T-SQL. Используйте квадратные скобки:

foreach (KeyValuePair<string, object> pair in values) 
    query += "[" + pair.Key + "],"; 
+0

Да, это работает, спасибо! – Majak

1

имена столбцов может начинаться с цифры, в этом случае вы должны окружить его []: имена

query += "[" + pair.Key + "],"; 

параметров, однако, не может. Вам нужно настроить стратегию для преобразования имен, начинающихся с цифр, в другое. Например:

public void Insert(string table, Dictionary<string, object> values) 
{ 
    string query = "INSERT INTO " + table + " ("; 

    foreach (KeyValuePair<string, object> pair in values) 
     query += "[" + pair.Key + "],"; 

    query = query.Substring(0, query.Length - 1) + ")"; 
    query += "VALUES ("; 

    foreach (KeyValuePair<string, object> pair in values) 
     query += ParamName(pair.Key) + ","; 

    query = query.Substring(0, query.Length - 1) + ")"; 

    using (var sqlConnection = new SqlConnection("...")) 
    { 
     sqlConnection.Open(); 
     using (SqlCommand command = sqlConnection.CreateCommand()) 
     { 
      command.CommandText = query; 
      foreach (KeyValuePair<string, object> pair in values) 
      { 
       command.Parameters.AddWithValue(ParamName(pair.Key), pair.Value); 
      } 
      // execute command 
      command.ExecuteNonQuery(); 
     } 
    } 
} 

private string ParamName(string input) 
{ 
    return "@_" + input.Replace(" ", "_"); 
}