2013-04-09 9 views
4

у меня есть проблемы вставки данных из текстового поля в базу данных доступа мс, я получаю сообщение об ошибке «Syntax error in INSERT INTO.»вставки в базу данных доступа

Может кто-нибудь помочь мне, пожалуйста? вот код:

public void button1_Click(object sender, EventArgs e)//save 
{ 
using (OleDbConnection conn = new 
OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data 
Source=|DataDirectory|\productdb.mdb")) 
{ 
OleDbCommand CmdSql = new OleDbCommand("Insert into [product](Kod, names, 
price,type,volume,manufacturer,importer) 
enter code here 
{ 
conn.Open(); 
CmdSql.Parameters.AddWithValue("@Kod", textBox1.Text); 
CmdSql.Parameters.AddWithValue("@names", textBox2.Text); 
CmdSql.Parameters.AddWithValue("@price", textBox3.Text); 
CmdSql.Parameters.AddWithValue("@type", textBox4.Text); 
CmdSql.Parameters.AddWithValue("@volume", textBox5.Text); 
CmdSql.Parameters.AddWithValue("@manufacturer", textBox6.Text); 
CmdSql.Parameters.AddWithValue("@importer", textBox7.Text); 
CmdSql.ExecuteNonQuery();// i get the error here<<< 
conn.Close(); 
} 
} 
+1

"введите код здесь" Похоже, вы пропустили какой-то код? –

ответ

7

Вы пропускаете VALUES часть вашей вставки заявления:

OleDbCommand CmdSql = new OleDbCommand("Insert into [product] (Kod, [names], price, type, volume, manufacturer, importer) VALUES (@Kod, @names, @price, @type, @volume, @manufacturer, @importer)", conn); 

И вы используете Access и OldeDbCommand ... так что вы на самом деле нужно использовать ? вместо имени параметр:

OleDbCommand CmdSql = new OleDbCommand("Insert into [product] (Kod, [names], price, type, volume, manufacturer, importer) VALUES (?, ?, ?, ?, ?, ?, ?)", conn); 

См this question для получения дополнительной информации.

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

0

Вы написали неполную команду. Оно должно быть как:

OleDbCommand CmdSql = new OleDbCommand("Insert into [product](Kod, names, 
price,type,volume,manufacturer,importer) values(@Kod,@names,@price,@type, 
@volume,@manufacturer,@importer)"); 

Названные параметры поддерживаются только в SqlCommand не OleDbCommand, так что вы должны использовать? вместо параметров в командном тексте.

+0

По-прежнему такая же ошибка – user2263271

+0

вместо @Kod, а остальное в Command Text попробуйте использовать?. В противном случае просто создайте фактический запрос в тексте команды, например: «вставить в товар (kod, имена, цену, тип, объем, производитель, импортер) значения (22,« My Name », 200,1,1000,« DELL », APPLE ') "заключить строки в одинарные кавычки. –

+0

попробовал это так: OleDbCommand CmdSql = новый OleDbCommand ("INSERT INTO [product]" + "([Kod], [имена], [цена], [тип], [объем], [производитель], [импортер]) «+» VALUES (? Kod, «имена», «цена», «тип», «объем», «производитель», «импортер») », conn); получить ту же ошибку – user2263271

0

OleDbCommand не поддерживает именованные параметры, поэтому ваш SQL заявление должно быть:

OleDbCommand CmdSql = new OleDbCommand(
    "INSERT INTO [product] " + 
    "(Kod, names, price, type, volume, manufacturer ,importer) " + 
    "VALUES (?, ?, ?, ?, ?, ?, ?)" 
    , conn); 
+0

попробовал это как OleDbCommand CmdSql = новый OleDbCommand («Вставить в [продукт] (Kod, [имена], цена, тип, объем, производитель, импортер) значения (@ Kod, @ names, @ price, @ type, @ volume , @ производитель, импортер @) "); все еще не работает – user2263271

+0

Прочтите ответ еще раз - 'OleDbCommand' не поддерживает именованные параметры. Вместо этого используйте вопросительные знаки. –

+0

не работает, все равно получите ту же ошибку – user2263271

2

Слово ИМЕНА является reserved keyword for MS-Access Jet SQL, вы должны заключить его в квадратные скобки. Это является причиной получения Синтаксической ошибки. (Конечно, считая, что недостающая часть VALUES - это просто опечатка). Поэтому правильный синтаксис:

OleDbCommand CmdSql = new OleDbCommand("Insert into [product] (Kod, [names],price,type," + 
             "volume,manufacturer,importer) " + 
             "VALUES (?, ?, ?, ?, ?, ?, ?)"; 

Я заменил заполнители для параметров одним вопросительным знаком. OleDb не поддерживает именованные параметры, и только вопросительный знак будет делать, но крайне важно добавить параметры в OleDbCommand в точной последовательности, ожидаемой командой.

Существует еще один аспект вашего кода, который необходимо решить. Для создания списка параметров вы используете метод AddWithValue. Это означает, что тип данных параметра неявно определяется типом данных значения. Вы используете везде TextBox.Text, и это строка. Таким образом, это может вызвать проблемы с обновлением, когда принимающее поле имеет другой тип (например, цена, вероятно, является числовой). Если поле базы данных не имеет текстового типа, добавьте соответствующее преобразование в значение входящего параметра.

Например:

// Supposing you have an in place validator for the text to be converted...... 
CmdSql.Parameters.AddWithValue("@price", Convert.ToDecimal(textBox3.Text)); 
+0

Хороший вызов неявного преобразования 'AddWithValue'. –

0

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

String query = "Insert into Supplier(Kod, names,price,type,volume,manufacturer,importer) values('" + textBox1.text + "','" +textBox2.text + "','" + textBox3.text + "','" + textBox4.text + "','" + textBox5.text + "','" + textBox6.text + "','" + textBox7.text + "') "; 
SqlCommand cmd = new SqlCommand(query, con); 
con.Open(); 
cmd.ExecuteNonQuery(); 
con.Close(); 
+0

Спасибо, это было очень полезно. – user2263271

+1

Это открывает дверь до SQL-инъекции. Это может не беспокоить то, что вы делаете, но если вы не используете параметры и не принимаете текст от пользователя, вы подвергаете свою базу данных SQL-инъекции. http://en.wikipedia.org/wiki/SQL_injection –

0
OleDbConnection con = new 
OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data 
Source=|DataDirectory|\productdb.mdb" 

String strSQL="Insert into [product](Kod, names, 
price,type,volume,manufacturer,importer) values(@Kod,@names,@price,@type, 
@volume,@manufacturer,@importer)" 

     OleDBCommand CmdSql= new OleDBCommand(strSQL, con); 
     CmdSql.CommandType = CommandType.Text; 

     CmdSql.Parameters.AddWithValue("@Kod", textBox1.Text); 
     CmdSql.Parameters.AddWithValue("@names", textBox2.Text); 
     CmdSql.Parameters.AddWithValue("@price", textBox3.Text); 
     CmdSql.Parameters.AddWithValue("@type", textBox4.Text); 
     CmdSql.Parameters.AddWithValue("@volume", textBox5.Text); 
     CmdSql.Parameters.AddWithValue("@manufacturer", textBox6.Text); 
     CmdSql.Parameters.AddWithValue("@importer", textBox7.Text); 

     con.Open(); 
     try 
     { 
      CmdSql.ExecuteNonQuery(); 
     } 
     catch (Exception ex) 
     { 
      ex.Message.ToString(); 
     } 
     finally 
     { 
      con.Close(); 
      CmdSql.Dispose(); 
     } 
0
string Query = "insert into tablename values ('" + txtstring.text + "', " + txtDouble.text + ")"; 
Cmd = new OleDbCommand(); 
Cmd.Connection = Con; 
Cmd.CommandText = Query; 
Cmd.ExecuteNonQuery(); 
-2

Feilds= "T1,T2,T3,T4,T5,T6,T7,T8" ; value =
"'NAJAFI','DONYA','3/26/2014 12:00:00 AM','کد :1 نام و نام خانوادگی:افشین نجفی','کد :df نام و نام خانوادگی:fsdfsdf','*','-','3/4/2014 7:13:29 PM" Table ="Table " ;

OleDbConnection sc = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;DataSource="[email protected]"G:\sazenama\SazeNama\Sazeama\DBSazeNama.accdb"); 
       sc.Open(); 
       OleDbCommand sm; 
       if (edit == false) 
        sm = new OleDbCommand("insert into " + Table + "(" + Feilds + ")  values(" + value + "')", sc); 
       else 
        sm = new OleDbCommand("update " + Table + " set " + Feilds + "'", sc); 

       sm.ExecuteNonQuery(); 
Смежные вопросы