2015-12-14 4 views
-1

У меня есть метод, который только работает, как показано ниже (с использованием cmd.Parameters.Add()):Invalid ошибка имя столбца при использовании объекта String.Format в качестве параметра запроса для SqlCommand

public int insert_customer(
    String _firstname, 
    String _middlename, 
    String _lastname, 
    String _address, 
    String _address2, 
    String _city, 
    String _state, 
    String _zipcode) 
{ 
    int rows; 

    String query = "INSERT INTO EmployeeInformation (firstname, middlename, lastname, address, address2, city, state, zipcode) values (@_firstname, @_middlename, @_lastname, @_address, @_address2, @_city, @_state, @_zipcode);"; 

    SqlConnection conn = new SqlConnection(this.connectionstring); 
    SqlCommand cmd = new SqlCommand(query, conn); 

    cmd.Parameters.Add("@_firstname", SqlDbType.VarChar, 50).Value = _firstname; 
    cmd.Parameters.Add("@_middlename", SqlDbType.VarChar, 50).Value = _middlename; 
    cmd.Parameters.Add("@_lastname", SqlDbType.VarChar, 50).Value = _lastname; 
    cmd.Parameters.Add("@_address", SqlDbType.VarChar, 50).Value = _address; 
    cmd.Parameters.Add("@_address2", SqlDbType.VarChar, 50).Value = _address2; 
    cmd.Parameters.Add("@_city", SqlDbType.VarChar, 50).Value = _city; 
    cmd.Parameters.Add("@_state", SqlDbType.VarChar, 50).Value = _state; 
    cmd.Parameters.Add("@_zipcode", SqlDbType.VarChar, 50).Value = _zipcode;    

    try 
    { 
     conn.Open(); 
     rows = cmd.ExecuteNonQuery(); 
    } 
    catch (SqlException ex) 
    { 
     throw new Exception(ex.Message); 
    } 
    finally 
    { 
     conn.Close(); 
    } 
    return rows; 
} 

Но когда я только используйте объект String.Format(), как показано ниже, чтобы вставить значения из метода insert_customer. Я получаю сообщение об ошибке. Ошибка ниже, где «xxx» - это значения из моих текстовых полей.

Недопустимое имя столбца 'ххх'. \ Г \ nInvalid имя столбца 'ххх'. \ Г \ nInvalid имя столбца 'ххх'. \ Г \ nInvalid имя столбца 'ххх'. \ Г \ nInvalid имя столбца ' xxx '. \ r \ nInvalid имя столбца' xxx '. \ r \ nInvalid имя столбца' xxx '. \ r \ nInvalid имя столбца' xxx '.

Кто-нибудь знает, почему первый метод работает, но метод ниже не работает?

public int insert_customer(
    String _firstname, 
    String _middlename, 
    String _lastname, 
    String _address, 
    String _address2, 
    String _city, 
    String _state, 
    String _zipcode) 
{ 
    int rows; 

    String query = String.Format(
     "INSERT INTO EmployeeInformation (firstname, middlename, lastname, address, address2, city, state, zipcode) values ({0}, {1}, {2}, {3}, {4}, {5}, {6}, {7});", 
     _firstname, _middlename, _lastname, _address, _address2, _city, _state, _zipcode); 

    SqlConnection conn = new SqlConnection(this.connectionstring); 
    SqlCommand cmd = new SqlCommand(query, conn); 

    try 
    { 
     conn.Open(); 
     rows = cmd.ExecuteNonQuery(); 
    } 
    catch (SqlException ex) 
    { 
     throw new Exception(ex.Message); 
    } 
    finally 
    { 
     conn.Close(); 
    } 
    return rows; 
} 
+0

Я не так опытен SQL, как хотелось бы, но я верю, что при передаче значений в insert вы можете заменить индексы на '?', Например: '' INSERT INTO EmployeeInformation (firstname, middlename, lastname , address, address2, city, state, zipcode) значения (?,?,?,?,?,?,?,?); ", _firstname, _middlename, _lastname, _address, _address2, _city, _state, _zipcode); ' –

+0

@SeanPerkins заменяет {x} на? дал мне '{" Неправильный синтаксис около '?'. "}', насколько мне известно. Индексирование {x} требуется объектом 'String.Format' – jes516

+3

** НЕ ИСПОЛЬЗУЙТЕ **' string.Format () 'для создания ваших SQL-инструкций - ** DO USE ** параметризованная версия (с' @ _firstname') ** всегда ** - это не позволяет вам открывать атаки SQL-инъекций, это лучше для производительности, и это избегает много проблем с наличием котировок или нет, форматирование даты и т. д. - ** ВСЕГДА ** используйте параметризованные запросы - без исключений !! –

ответ

1

Значения строк, которые должны быть вставлены в таблицу, должны быть заключены в кавычки. Второй запрос вставки, созданный с помощью string.format, этого не делает. Первый запрос на вставку является параметризованным, который выполняется процедурой sp_executesql. Нет необходимости в котировках.

+0

, которая сделала это, спасибо, сэр. '... values ​​('{0}', '{1}', '{2}', '{3}', '{4}', '{5}', '{6}', '{ 7} ') ' – jes516

+0

Добро пожаловать. –

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