如果我犯了这个错误,我似乎无法理解。
OleDbCommand command = new OleDbCommand();
command.Connection = connection;
command.CommandText = "INSERT INTO statement workers values(?,?,?,?,?,?,?,?,?)";
command.Parameters.AddWithValue("@Tab", tabtextBox1.Text);
command.Parameters.AddWithValue("@User", usertextBox2.Text);
command.Parameters.AddWithValue("@Pass", passtextBox4.Text);
command.Parameters.AddWithValue("@Names", namestextBox3.Text);
command.Parameters.AddWithValue("@Tele", teletextBox6.Text);
command.Parameters.AddWithValue("@Job", jobtextBox9.Text);
command.Parameters.AddWithValue("@Pay", paytextBox7.Text);
command.Parameters.AddWithValue("@Date", dateofdateTimePicker2.Value.ToShortDateString());
command.Parameters.AddWithValue("@DOB", dobdateTimePicker1.Value.ToShortDateString());
command.ExecuteNonQuery();
MessageBox.Show("Data Saved");在我尝试插入详细信息之后,它给了我一个答复:
oledbexception在insert into语句中出现未处理语法错误
发布于 2016-03-30 12:07:03
当表名或列名包含一个空格或它是一个保留字时,您需要将该名称括在方括号中,以避免混淆为解释命令而调用的sql解析器。
在你的上下文中,你应该写
command.CommandText = "INSERT INTO [statement workers] values(?,?,?,?,?,?,?,?,?)";编辑
在查看了您的字段的名称(并假设字段的顺序与您键入的字段完全相同)之后,您应该更改添加参数的顺序,以与表中字段的顺序完全匹配。
OleDb不能使用命名占位符来设置参数集合,因此必须严格遵循字段顺序。
如果不这样做,那么一个值最终可能会出现在另一个字段中,从而产生问题,比如当您试图在date字段中存储一个十进制值时。(当然,如果在表名之后添加列名,则可以更改顺序)
command.Connection = connection;
command.CommandText = "INSERT INTO statement workers values(?,?,?,?,?,?,?,?,?)";
command.Parameters.Add("@Tab", OleDbType.Integer).Value = Convert.ToInt32( tabtextBox1.Text);
command.Parameters.Add("@User", OleDbType.VarWChar).Value = usertextBox2.Text;
command.Parameters.Add("@Pass", OleDbType.VarWChar).Value = passtextBox4.Text;
command.Parameters.Add("@Names", OleDbType.VarWChar).Value = namestextBox3.Text;
command.Parameters.Add("@Tele", OleDbType.Integer).Value = Convert.ToInt32(teletextBox6.Text);
command.Parameters.Add("@Job", OleDbType.VarWChar).Value = jobtextBox9.Text;
command.Parameters.Add("@Date", OleDbType.Date).Value = dateofdateTimePicker2.Value;
command.Parameters.Add("@DOB", OleDbType.Date).Value = dateTimePicker1.Value);
command.Parameters.Add("@Pay", OleDbType.Decimal).Value = Convert.ToDecimal(paytextBox7.Text);
command.ExecuteNonQuery();通过这种方式,您可以按照表字段所期望的确切顺序设置值。
注意,我已经用更精确的AddWithValue删除了危险的Add,后面跟着字段所期望的数据类型。
AddWithValue无法知道数据库所期望的类型,因此可以查看参数的类型。因为您传递所有字符串,所以数据库引擎被迫将它们转换回预期的字段类型。
有时(特别是对于日期和十进制字段),这是不正确的。
边注:
发布于 2016-03-30 12:49:51
另外,您必须使用DateTimePickers的值,而不是字符串:
command.Parameters.AddWithValue("@Date", dateofdateTimePicker2.Value);
command.Parameters.AddWithValue("@DOB", dobdateTimePicker1.Value);并说明字段名:
command.CommandText = "INSERT INTO [statement workers] (fielname1, fieldname2, .., fieldname9) values(?,?,?,?,?,?,?,?,?)";https://stackoverflow.com/questions/36308290
复制相似问题