【问题标题】:Adding to database using Oledb Syntax error in INSERT INTO statement在 INSERT INTO 语句中使用 Oledb 语法错误添加到数据库
【发布时间】:2014-04-27 18:00:32
【问题描述】:

当我点击添加按钮插入新书时,在 cmd.ExecuteNonQuery(); 处出现错误INSERT INTO 语句中的语法错误。我错过了什么吗?

protected void btnAddBook_Click(object sender, EventArgs e)
            {
                string connect = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|Bookdb.accdb";
                using (OleDbConnection conn = new OleDbConnection(connect))
                {
                    OleDbCommand cmd = new OleDbCommand("INSERT INTO Books (Title, Author, Price, Edition) VALUES (@Title, @Author, @Price, @Edition)");
                    cmd.CommandType = CommandType.Text;
                    cmd.Connection = conn;
                    cmd.Parameters.AddWithValue("@Title", TextBox1.Text);
                    cmd.Parameters.AddWithValue("@Author", TextBox2.Text);
                    cmd.Parameters.AddWithValue("@Price", TextBox3.Text);
                    cmd.Parameters.AddWithValue("@Edition", TextBox4.Text);


                    conn.Open();
                    cmd.ExecuteNonQuery();
                    conn.Close();
                }

【问题讨论】:

  • 如果我没记错的话,OleDb 参数不应该在字符串中命名,只是用? 标记并以相同的顺序添加到参数列表中。 new OleDbCommand("INSERT INTO Books (Title, Author, Price, Edition) VALUES (?,?,?,?)");
  • 这很奇怪,您的代码和命令文本似乎是正确的。当您连接到 Access 数据库时,也接受参数占位符,虽然不是 OleDb 预期的形式。唯一的问题可能是价格字段。如果 Price 是数据库中的数字字段,那么最好在将值添加到参数 @price 时对其进行转换。例如Convert.ToDecimal(TextBox3.Text)
  • 还是一样的错误 cmd.Parameters.AddWithValue("@Price", Convert.ToDecimal(TextBox3.Text));

标签: c# oledb


【解决方案1】:

我可以找到您的代码可能失败的唯一原因是价格字段是否是数据库表中的数字字段。您正在使用 AddWithValue 创建一个参数,并且此方法创建一个参数,其数据类型派生自传递的值的数据类型。您传递一个字符串 (TextBox3.Text),因此 AddWithValue 创建一个字符串参数。

您可以尝试强制 AddWithValue 创建一个数字参数

 cmd.Parameters.AddWithValue("@Price", Convert.ToDecimal(TextBox3.Text));

(当然假设是十进制价格列)

【讨论】:

  • 谢谢,但我仍然在 INSERT INTO 语句中遇到语法错误。
【解决方案2】:

在你调用conn.Open()之前,你需要调用cmd.Prepare(),这样你设置的所有参数才会真正加载到SQL语句中。

【讨论】:

  • 准备需要一个开放且可用的连接。连接的当前状态为关闭。
  • 在这种情况下,将 conn.Open() 移到创建 OleDbCommand cmd = ... 的行上方,但将 cmd.Prepare() 保留在所有 AddWithValue 行下方。
  • conn.Open(); cmd.CommandType = CommandType.Text; cmd.Connection = 连接; cmd.Prepare(); cmd.Parameters.AddWithValue("@Title", TextBox1.Text);在 INSERT INTO 语句中仍然给出错误语法错误
猜你喜欢
  • 2013-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多