c# - oledbexception 是插入语句中未处理的语法错误

标签 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 was unhandled syntax error in insert into statement

最佳答案

当表名或列名包含空格或者是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

关于c# - oledbexception 是插入语句中未处理的语法错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36308290/

相关文章:

c# - 如何在 C# 中解析 JSON 对象

c# - 在一行中写入列表/数组

ms-access - 检索 Access 数据库中的表单列表

ms-access - 表达式生成器中的表单属性问题 - MS Access 2016

vba - 使用access vba检查Windows日期格式

c++ - 如何提高 MS Access INSERT 性能

c# - 检查 List<string> 中的分组值

c# - 在 Windows 窗体 (c#.net) 应用程序中加速从磁盘加载图像

c# - 用 lambda 表达式替换字符串作为属性名称

vba - Access 2010 编译报错User-defined type not defined