首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >oledbexception在insert into语句中出现未处理语法错误

oledbexception在insert into语句中出现未处理语法错误
EN

Stack Overflow用户
提问于 2016-03-30 12:02:30
回答 2查看 261关注 0票数 1

如果我犯了这个错误,我似乎无法理解。

代码语言:javascript
运行
复制
        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语句中出现未处理语法错误

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-03-30 12:07:03

当表名或列名包含一个空格或它是一个保留字时,您需要将该名称括在方括号中,以避免混淆为解释命令而调用的sql解析器。

在你的上下文中,你应该写

代码语言:javascript
运行
复制
command.CommandText = "INSERT INTO [statement workers] values(?,?,?,?,?,?,?,?,?)";

编辑

在查看了您的字段的名称(并假设字段的顺序与您键入的字段完全相同)之后,您应该更改添加参数的顺序,以与表中字段的顺序完全匹配。

OleDb不能使用命名占位符来设置参数集合,因此必须严格遵循字段顺序。

如果不这样做,那么一个值最终可能会出现在另一个字段中,从而产生问题,比如当您试图在date字段中存储一个十进制值时。(当然,如果在表名之后添加列名,则可以更改顺序)

代码语言:javascript
运行
复制
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. 从安全的角度来看,密码永远不应该存储在clear text.There中,许多文章解释了这是如何危险的,以及如何散列密码。您可以从这里开始搜索:在数据库中存储密码的最佳方法
票数 4
EN

Stack Overflow用户

发布于 2016-03-30 12:49:51

另外,您必须使用DateTimePickers的值,而不是字符串:

代码语言:javascript
运行
复制
command.Parameters.AddWithValue("@Date", dateofdateTimePicker2.Value);
command.Parameters.AddWithValue("@DOB", dobdateTimePicker1.Value);

并说明字段名:

代码语言:javascript
运行
复制
command.CommandText = "INSERT INTO [statement workers] (fielname1, fieldname2, .., fieldname9) values(?,?,?,?,?,?,?,?,?)";
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36308290

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档