У меня есть метод, который только работает, как показано ниже (с использованием 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;
}
Я не так опытен SQL, как хотелось бы, но я верю, что при передаче значений в insert вы можете заменить индексы на '?', Например: '' INSERT INTO EmployeeInformation (firstname, middlename, lastname , address, address2, city, state, zipcode) значения (?,?,?,?,?,?,?,?); ", _firstname, _middlename, _lastname, _address, _address2, _city, _state, _zipcode); ' –
@SeanPerkins заменяет {x} на? дал мне '{" Неправильный синтаксис около '?'. "}', насколько мне известно. Индексирование {x} требуется объектом 'String.Format' – jes516
** НЕ ИСПОЛЬЗУЙТЕ **' string.Format () 'для создания ваших SQL-инструкций - ** DO USE ** параметризованная версия (с' @ _firstname') ** всегда ** - это не позволяет вам открывать атаки SQL-инъекций, это лучше для производительности, и это избегает много проблем с наличием котировок или нет, форматирование даты и т. д. - ** ВСЕГДА ** используйте параметризованные запросы - без исключений !! –