2013-07-29 5 views
0

Попытка вставить в базу данных из текстовых полей, но она будет принимать только целые числа, а не символы - в чем проблема?Невозможно ввести значения символов из текстового поля в базу данных

string sCMD = string.Format("INSERT INTO [Table] ([Item], [Des1],[Des2], [Prodline], [ANR], [STime]) VALUES({0},{1},'0',{2},{3},{4})" 
      ,txtText1.Text, txtText2.Text, txText3.Text, txtText4.Text, txtText5.Text); 

В этом контексте имя "" не допускается. Допустимыми выражениями являются константы, константные выражения и (в некоторых контекстах) переменные. Имена столбцов запрещены.

+0

Каковы таблицы в таблице DB? –

+1

Представьте, что произойдет, если пользователь введет «некоторый» знак «e» в ваше текстовое поле. –

+0

Является ли ваша база данных разрешающей char/varchar в этом конкретном столбце? И какую базу данных вы используете? – butterbox

ответ

0

Вот что-то рассмотреть следующие вопросы:

using (SqlConnection c = new SqlConnection(connString)) 
{ 
    c.Open(); 

    using (SqlCommand cmd = new SqlCommand("INSERT INTO [Table] ([Item], [Des1],[Des2], [Prodline], [ANR], [STime]) VALUES(@Item,@Des1,'0',@ProdLine,@ANR,@STime)", c)) 
    { 
     cmd.Parameters.AddWithValue("@Item", txtText1.Text); 
     cmd.Parameters.AddWithValue("@Des1", txtText2.Text); 
     cmd.Parameters.AddWithValue("@ProdLine", txText3.Text); 
     cmd.Parameters.AddWithValue("@ANR", txtText4.Text); 
     cmd.Parameters.AddWithValue("@STime", txtText5.Text); 

     cmd.ExecuteNonQuery(); 
    } 
} 

Если вы должны были отправить заявление SQL вы строите на сервер может выглядеть примерно так:

INSERT INTO [Table] ([Item], [Des1],[Des2], [Prodline], [ANR], [STime]) 
VALUES(Item Name,Here is my description.,'0',Prod line,ANR value,some time) 

Очевидно, что происходит сбой , Это даже не окружает значения одинарными кавычками. Теперь все они не могут быть персонажами, я понимаю, но вы понимаете.

Но для того, чтобы добавить оскорбление к ране, он широко открыт до SQL Injection так, как вы его написали. С параметризованным подходом это не так.

0

Это очень опасная строка кода.

Для начала вы создаете строку без разделителей для значений, а это означает, что единственными значениями, которые могут передаваться с вашей проблемой, являются целые числа. Все остальное нужно разграничить, чего вы не делаете в этой инструкции String.Format.

Хуже того, вы пытаетесь создать инструкцию sql из прямого пользовательского ввода. Любое странное значение может привести к ошибке вашего кода или, что еще хуже, вызвать выполнение нежелательного кода. Представьте, что произойдет с введенным пользователем, например, 'sdf','sdfs',sdf' в качестве значения FIRST. В результате строка будет иметь 3 правильных значения для первых трех столбцов, которые были получены из первого текстового текста.

Теперь изображение, что произойдет, если пользователь введет что-то вроде 'blablabla';DROP TABLE sometable;--. Это приведет к выполнению команды Delete. Это стандартный сценарий атаки SQL-инъекций.

Есть еще много проблем, например, когда вы пытаетесь передать числа с поплавками, датами или любым типом, преобразование которого в строку зависит от вашей локали.

Вместо того чтобы пытаться построить SQL-запрос путем конкатенации строк, вы должны использовать параметризованные запросы, как описано в Give me parameterized SQL or give me death. Полученный код легче писать, выполняет гораздо быстрее, не имеет ошибок преобразования и не подвержен атакам SQL-инъекций,

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