如何解决“INSERT INTO 语句中的语法错误”

Posted

技术标签:

【中文标题】如何解决“INSERT INTO 语句中的语法错误”【英文标题】:How to solve "Syntax error in INSERT INTO statement" 【发布时间】:2016-12-09 10:13:32 【问题描述】:

连接工作正常。我只是在这部分遇到问题。我对 RECORD 表的设计视图如下:

名称类型大小

     RecordID                Long Integer                             4
     BatchID                 Long Integer                             4

     ProcessID               Long Integer                             4
     EmployeeID              Long Integer                             4
     Start                   Date With Time                           8

     End                     Date With Time                           8
     Status                  Yes/No                                   1
     Hour                    Long Integer

这是我的代码:

protected void btnSave_Click(object sender, EventArgs e)
    

        DateTime a = new DateTime(cldStart.SelectedDate.Year,cldStart.SelectedDate.Month,cldStart.SelectedDate.Day,Convert.ToInt32(ddlStartHour.SelectedValue),Convert.ToInt32(ddlStartMinute.SelectedValue),00);
        DateTime b = new DateTime(cldEnd.SelectedDate.Year, cldEnd.SelectedDate.Month, cldEnd.SelectedDate.Day, Convert.ToInt32(ddlEndHour.SelectedValue), Convert.ToInt32(ddlEndMinute.SelectedValue), 00);
        TimeSpan c = b-a;

        //insert into record table
        using (OleDbConnection con = new OleDbConnection(conString))
        
            try
            
                OleDbCommand cmd = new OleDbCommand();
                cmd.CommandType = CommandType.Text;
                cmd.CommandText = "INSERT INTO RECORD (BatchID,ProcessID,EmployeeID,Start,End,Status,Hour) VALUES (@batchid,@processid,@employeeid,@start,@end,@status,@hours)";
                cmd.Parameters.AddWithValue("@batchid", Convert.ToInt32(ddlBatchNo.SelectedValue));
                cmd.Parameters.AddWithValue("@processid", Convert.ToInt32(ddlSubCategory.SelectedValue));
                cmd.Parameters.AddWithValue("@employeeid", Convert.ToInt32(ddlEmployeeId.SelectedValue));
                   cmd.Parameters.AddWithValue("@start",a.ToString() );
                   cmd.Parameters.AddWithValue("@end", b.ToString());
                   cmd.Parameters.AddWithValue("@hours", c.ToString());
                   cmd.Parameters.AddWithValue("@status",chboxStatus.Checked);
                cmd.Connection = con;
                con.Open();
                cmd.ExecuteNonQuery();
            
            catch (Exception ex)
            
                txtRemark.Text = "wrong";
            
        

    

我正在尝试插入记录表,但它显示了我

“InSERT into 命令中的语法错误”。

不知道怎么回事。

【问题讨论】:

【参考方案1】:

OleDbCommand 没有名称参数的概念,因此您必须按照与查询中相同的顺序定义参数。

   cmd.Parameters.AddWithValue("@hours", c.ToString());
   cmd.Parameters.AddWithValue("@status",chboxStatus.Checked);

所以你应该有

   cmd.Parameters.AddWithValue("@status",chboxStatus.Checked);
   cmd.Parameters.AddWithValue("@hours", c.ToString());

但在您的查询中,状态是在几个小时之前。也像其他人提到的那样修复您的保留字。

【讨论】:

【参考方案2】:

您的列名是 end,hour 之类的关键字,因此您需要将其括在大括号中

cmd.CommandText = "INSERT INTO RECORD (BatchID,ProcessID,EmployeeID,Start,[End],Status,[Hour]) VALUES (@batchid,@processid,@employeeid,@start,@end,@status,@hours)";

【讨论】:

非常感谢!!!我犯了一个使用列名作为关键字的愚蠢错误!!现在它完全可以正常工作了【参考方案3】:

Start,End,Status,Hour 字段名称是关键字。将它们更改为 [Start],[End],[Status],[Hour] 或更改数据库中的字段名称

【讨论】:

【参考方案4】:

你的表名与记录关键字相同

试着用括号括起来

protected void btnSave_Click(object sender, EventArgs e)

    DateTime a = new DateTime(cldStart.SelectedDate.Year,cldStart.SelectedDate.Month,cldStart.SelectedDate.Day,Convert.ToInt32(ddlStartHour.SelectedValue),Convert.ToInt32(ddlStartMinute.SelectedValue),00);
    DateTime b = new DateTime(cldEnd.SelectedDate.Year, cldEnd.SelectedDate.Month, cldEnd.SelectedDate.Day, Convert.ToInt32(ddlEndHour.SelectedValue), Convert.ToInt32(ddlEndMinute.SelectedValue), 00);
    TimeSpan c = b-a;

    //insert into record table
    using (OleDbConnection con = new OleDbConnection(conString))
    
        try
        
            OleDbCommand cmd = new OleDbCommand();
            cmd.CommandType = CommandType.Text;
            cmd.CommandText = "INSERT INTO [RECORD] (BatchID,ProcessID,EmployeeID,Start,End,Status,Hour) VALUES (@batchid,@processid,@employeeid,@start,@end,@status,@hours)";
            cmd.Parameters.AddWithValue("@batchid", Convert.ToInt32(ddlBatchNo.SelectedValue));
            cmd.Parameters.AddWithValue("@processid", Convert.ToInt32(ddlSubCategory.SelectedValue));
            cmd.Parameters.AddWithValue("@employeeid", Convert.ToInt32(ddlEmployeeId.SelectedValue));
               cmd.Parameters.AddWithValue("@start",a.ToString() );
               cmd.Parameters.AddWithValue("@end", b.ToString());
               cmd.Parameters.AddWithValue("@hours", c.ToString());
               cmd.Parameters.AddWithValue("@status",chboxStatus.Checked);
            cmd.Connection = con;
            con.Open();
            cmd.ExecuteNonQuery();
        
        catch (Exception ex)
        
            txtRemark.Text = "wrong";
        
    


【讨论】:

以上是关于如何解决“INSERT INTO 语句中的语法错误”的主要内容,如果未能解决你的问题,请参考以下文章

为啥会出现“INSERT INTO 语句中的语法错误”?

“INSERT INTO 语句中的语法错误”错误 - 错误是啥?

使用 DateTime 时 INSERT INTO 语句中的语法错误

asp.net 中的 INSERT INTO 语句中的语法错误

INSERT INTO 语句中的语法错误,没有给出其他详细信息

INSERT INTO 语句中的语法错误(将多条记录从 Gridview 插入到 Access)