1

当我尝试将值插入 Access 数据库时,我不断收到错误消息。

该错误是语法错误,导致以下异常:

OleDbException 是 INSERT INTO 语句中未处理的语法错误。

private OleDbConnection myCon;

public Form1()
{
    InitializeComponent();
    myCon = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0; Data Source=C:\File.mdb");
}

private void insertuser_Click(object sender, EventArgs e)
{
    OleDbCommand cmd = new OleDbCommand();
    myCon.Open();
    cmd.Connection = myCon;
    cmd.CommandType = CommandType.Text;

    cmd.CommandText = "INSERT INTO User ([UserID], [Forename], [Surname], " +
                                        "[DateOfBirth], [TargetWeight], [TargetCalories], [Height]) " +
                      "VALUES ('" + userid.Text.ToString() + "' , '" +
                                    fname.Text.ToString() + "' , '" +
                                    sname.Text.ToString() + "' , '" +
                                    dob.Text.ToString() + "' , '" +
                                    tarweight.Text.ToString() + "' , '" +
                                    tarcal.Text.ToString() + "' , '" +
                                    height.Text.ToString() + "')";

    cmd.ExecuteNonQuery();
    myCon.Close();
}
4

6 回答 6

8

好吧,您还没有指定错误是什么——但您的第一个问题是您将数据直接插入到 SQL 语句中。不要那样做。您正在邀请SQL 注入攻击

请改用参数化 SQL 语句。完成此操作后,如果仍有问题,请使用新代码编辑此问题并说出错误所在。新代码可能已经更清晰了,因为不会涉及大量串联,很容易隐藏不匹配的括号之类的东西。

编辑:正如评论中提到的,Jet/ACE 容易受到较少类型的 SQL 注入攻击,因为它不允许 DML。对于这个 INSERT 语句,实际上可能没有漏洞——但是对于以类似方式编写的带有 WHERE 子句的 SELECT,用户输入可以绕过 WHERE 子句的某些保护。我强烈建议您理所当然地使用参数化查询:

  • 它们意味着您不必逃避用户数据
  • 他们将数据与代码分开
  • 如果您从 Jet/ACE 迁移(无论是迁移此特定代码,还是只是您个人开始在不同的数据库上工作),您将不必担心
  • 对于日期等其他数据类型,您无需做任何工作即可将数据转换为适合数据库的形式

(您也不需要对ToString.Text

于 2011-01-07T16:15:32.207 回答
4

我将此作为对重复问题的评论发布在:C# OleDb Exception 中的 INSERT INTO 语句中的语法错误无法发现错误

将括号 [] 放在表名称“用户”周围。它是 SQL Server 中的保留字。

“用户”也是 Access 中的保留字(由连接字符串中的提供者判断)。

但我完全同意 Jon 的观点——如果你修复了当前的实现,你只是打开了一个很大的安全漏洞(针对你的 User 表,不少于!)

于 2011-01-07T17:28:28.283 回答
1

如果您的数据库表包含使用 Microsoft Jet 4.0 保留字的列名,则可能会出现此问题。

更改数据库表中的列名,以便不使用 Jet 4.0 保留字。

于 2014-04-23T11:43:56.553 回答
0

如果TargetWeightHeightTargetCalories是浮点或整数值,则它们不需要在 SQL 语句中用引号引起来。

此外,与您的问题没有直接关系,但您应该真正考虑使用参数化查询。您的代码很容易受到 SQL 注入的攻击。

于 2011-01-07T19:13:26.247 回答
0

在这之后

cmd.CommandText="INSERT INTO User ([UserID], [Forename], [Surname], [DateOfBirth], [TargetWeight], [TargetCalories], [Height]) Values ('" + userid.Text.ToString() + "' , '" + fname.Text.ToString() + "' , '" + sname.Text.ToString() + "' , '" + dob.Text.ToString() + "' , '" + tarweight.Text.ToString() + "' , '" + tarcal.Text.ToString() + "' , '" + height.Text.ToString() + "')";

检查其中包含的内容,可能[DateOfBirth]有非法格式

于 2013-05-12T07:34:45.080 回答
0
public decimal codes(string subs)
    {
        decimal a = 0;


        con_4code();
            query = "select SUBJINTN.[SCODE] from SUBJINTN where SUBJINTN.[ABBR] = '" +                         subs.ToString() + "'";
            cmd1 = new OleDbCommand(query, concode);
            OleDbDataReader dr = cmd1.ExecuteReader();

这是 dr 中的错误,它说 DBMS 中的语法错误 ehile 运行良好

            if (dr.Read())
            {
                a = dr.GetDecimal(0);
                MessageBox.Show(a.ToString());
            }
            return a;



    }
于 2012-03-26T08:35:24.630 回答