如果我犯了错误,我似乎无法得到。
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 statement
中是未处理的语法错误
答案 0 :(得分:4)
当表名或列名包含空格或者是reserved word时,您需要将该名称括在方括号中,以避免混淆调用的sql解析器来解释您的命令。
在您的上下文中,您应该写
command.CommandText = "INSERT INTO [statement workers] values(?,?,?,?,?,?,?,?,?)";
修改强>
在查看您的字段名称后(并假设字段的顺序与您键入的字段完全相同),您应该更改添加参数的顺序,以便与表格中字段的顺序完全匹配。
OleDb不能使用命名占位符来设置参数集合,因此严格遵循字段顺序非常重要
如果不这样做,那么值可能会在不同的字段中结束并产生问题,例如当您尝试在日期字段中存储小数值时。 (当然,如果在表名后添加列名,则可以更改订单)
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无法知道数据库所期望的类型,因此会查看参数的类型。由于您传递了所有字符串,因此强制数据库引擎将它们转换回预期的字段类型
有时(特别是日期和小数字段)这不能正常工作。
附注:
答案 1 :(得分:1)
此外,您必须使用DateTimePickers的值,而不是字符串:
command.Parameters.AddWithValue("@Date", dateofdateTimePicker2.Value);
command.Parameters.AddWithValue("@DOB", dobdateTimePicker1.Value);
并说明字段名称:
command.CommandText = "INSERT INTO [statement workers] (fielname1, fieldname2, .., fieldname9) values(?,?,?,?,?,?,?,?,?)";