【问题标题】:How to solve "Syntax error in INSERT INTO statement"如何解决“INSERT INTO 语句中的语法错误”
【发布时间】: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 命令中的语法错误”。

不知道怎么回事。

【问题讨论】:

    标签: c# ms-access oledb


    【解决方案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";
                }
            }
        
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多