插入到语句中oledbexception是未处理的语法错误

时间:2016-03-30 12:02:30

标签: c# ms-access

如果我犯了错误,我似乎无法得到。

        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

中是未处理的语法错误

2 个答案:

答案 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. 电话号码不应存储为数字,也不应存储。
  2. 从安全角度来看,永远不应存储密码 明文。有很多文章解释了这是多么危险以及如何散列密码。您可以从此处开始搜索:Best way to store password in database

答案 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(?,?,?,?,?,?,?,?,?)";