2013-05-08 142 views
-3

代码中没有错误,但数据库中没有信息出现。SQL语句,OleDbException错误INSERT

 string mysql; 
     mysql = "INSERT INTO Cars(Make,Model,Price,[Image]) VALUES ('" 
     + tbMake.Text + "','" + tbModel.Text + "'," + tbPrice.Text + ",'" +   FileUpload1.FileName + "')"; 
     siteDB.InsertCommand = mysql; 
     DataList1.DataBind(); 

干杯。

+7

好第一个问题是,你要的值直接嵌入到SQL,而不是使用参数化的SQL。 *先修复*,然后看看它是否有帮助。 (例如,它可以解决数据中引号的问题。) – 2013-05-08 13:05:03

+0

向Jon Skeet的陈述中添加一些内容:这也最大限度地减少了SQL注入的风险。 – jAC 2013-05-08 13:06:55

+2

为什么在插入语句中使用SelectCommand? – nmat 2013-05-08 13:07:04

回答

3

对于Access数据库,IMAGE字是保留关键字。
如果你想使用它,你需要用方brakets

"INSERT INTO Cars(Make,Model,Price,[Image]) VALUES ......" 

封装这将解决你眼前的问题,但正如约翰飞碟双向在其评论中指出,你需要使用参数化查询,因为这解决了也正确格式化文本值的问题。

如果模型名称(或make)包含单引号,那么您的便捷查询会发生什么?
另一个语法错误在等着你(从我的经验,它会咬你就在你已经完成了代码,并准备工作)

只是为了完成答案,随意测试,如果通过这种方式,将记录添加到您的分区

mysql = "INSERT INTO Cars(Make,Model,Price,[Image]) VALUES (?,?,?,?)"; 
OleDbCommand cmd = new OleDbCommand(mysql, con); 
cmd.Parameters.AddWithValue("@p1", tbMake.Text); 
cmd.Parameters.AddWithValue("@p2", tbModel.Text); 
cmd.Parameters.AddWithValue("@p3", Convert.ToDecimal(tbPrice.Text)); 
cmd.Parameters.AddWithValue("@p4", FileUpload1.FileName); 
cmd.ExecuteNonQuery(); 
+0

将此代码添加到代码中,没有错误但仍未出现在我的数据库中。 – Chris 2013-05-08 13:18:08

+0

附注。 OleDb无法通过名称识别参数。因此,不需要在参数占位符中输入名称。传统的OleDb方法是?字符。但是,Access会将它不能识别的所有内容视为参数,所以它也适用于如果您使用@ p1 ....但是请坚持以传统方式放置OleDb的参数占位符 – Steve 2013-05-08 14:10:30

+0

OleDbCommand cmd = new OleDbCommand( mysql,con); – Chris 2013-05-08 19:17:05

0

我假设siteDB是SQLDataAdapter。 在这种情况下,你的代码至少应该改成这样:

string mysql; 
     mysql = "INSERT INTO Cars(Make,Model,Price,Image) VALUES ('" 
     + tbMake.Text + "','" + tbModel.Text + "'," + tbPrice.Text + ",'" +   FileUpload1.FileName + "')"; 
     siteDB.InsertCommand = mysql; 
     DataList1.DataBind(); 
+0

这似乎是我的朋友完全一样,谢谢你。 – Chris 2013-05-08 13:23:55

+1

我上次检查时,有siteDB.SelectCommand = xxx。没关系 – Marco 2013-05-08 13:37:57