2013-02-13 2 views
0

Я пытался вставить конкретные данные в моей базе данных (в моем случае это Microsoft Access), это следующий код, который я написал с помощью C#:вставки в заблуждение Постулаты

string sql = "Insert into Orders(User,PID,PName,Price,Amount)" + 
      " values('" + od.User + "','" + od.Pid + "','" + 
      od.Pname + "','" + od.Price + "','" + od.Amount + "')"; 

сейчас предположим, что форма, которую я написал, прекрасна, не так ли? Ошибка, которую я получаю:

Ошибка синтаксиса в инструкции INSERT INTO.

+1

Возможно ли, что любое из ваших значений имеет одинарные кавычки в них? –

+0

Что является источником 'od'? Все ли строки столбцов в таблице базы данных? По первому вопросу, если это пользователь, у вас могут быть уязвимости Sql Injection. Посмотрите в параметризованные запросы в любом случае, потому что это также касается встроенных одинарных кавычек во входе, как считает @Mike. Во втором случае, если некоторые из этих столбцов являются числовыми, у вас возникнут проблемы с типом данных. –

+3

Почему вы не используете @Parameters при создании запроса Insert, тогда используйте команду 'command.Parameters.AddWithValues ​​(@paramname, paramvalue);' – MethodMan

ответ

3

User является reserved keyword. Поместите скобки вокруг него, чтобы указать, что вы хотите использовать его в качестве идентификатора, а не команду:

string sql = "Insert into Orders([User],PID,PName,Price,Amount)" + 
     " values('" + od.User + "','" + od.Pid + "','" + 
     od.Pname + "','" + od.Price + "','" + od.Amount + "')"; 

Это должно решить вашу непосредственную проблему. Использование параметризованного запроса (как было предложено несколькими) хорошо, чтобы избежать будущих проблем.

1

Измените код, чтобы использовать параметризованные команду:

string sql = "Insert into Orders([User],PID,PName,Price,Amount) values(@user, @pid, @pname, @price, @amount)"; 

..here you will need to add your parameters to your command 

Это и позволяет избежать атаки SQL-инъекции и предотвращает ошибки с неэкранированными символами.

1

Вот пример, на который вы можете следовать. Я вложил копию из чего-то, что я только что написал , вы можете захотеть следовать этому за будущие ссылки, обратите внимание на то, как используется метод Parameters.AddWithValue(), вместо того, чтобы строить строковую строку запроса с Quoted значения

private void btnInsert_Click(object sender, EventArgs e) 
{ 
    using(SqlConnection con = new SqlConnection(connString)) 
    { 
     con.Open(); 
     string Sql = "INSERT INTO Uyeleri (dID, FullName, Address, Mobile, Email, Comments) " + 
        "VALUES (@id, @name, @address, @mobile, @email, @comments"); 
     using(SqlCommand cmd = new SqlCommand(Sql, con)) 
     { 
      cmd.Parameters.AddWithValue("@id", txtdID.Text); 
      cmd.Parameters.AddWithValue("@name", txtAdiSoyadi.Text); 
      cmd.Parameters.AddWithValue("@address", txtAddress.Text); 
      cmd.Parameters.AddWithValue("@mobile", txtMobile.Text); 
      cmd.Parameters.AddWithValue("@email", txtEmail.Text); 
      cmd.Parameters.AddWithValue("@comments", txtComments.Text); 
      cmd.ExecuteNonQuery(); 
     } 
    } 
+0

Важное примечание к OP: значения добавляются в 'cmd.Parameters' в том же порядке, в котором они используются в вашем запросе. – Brad

+0

Да, я знаю, что ему нужен пример Брэда, чтобы он мог увидеть, как сделать Parameterized Query .. – MethodMan

+0

да, и это отличный пример (получил мой голос). Я также думал, что он должен знать вещь заказа, потому что это сбило меня с первого Я использовал эту процедуру. – Brad

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