INSERT INTO 中的语法错误

Syntax error in INSERT INTO

我第一次在 Access 中创建了一个 table 它的名字是 punchMachineData 它有以下列及其在 link http://prntscr.com/bjxs2v

上给出的各自类型

我像这样创建一个动态插入查询:

  string str = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\Sara\Desktop\punchMachineDataBase.accdb";
                    OleDbConnection conn = new OleDbConnection(str);
                    try
                    {
                        conn.Open();       
                        String my_querry = "INSERT into punchMachineData (empID,date,time,bstatus) Values('" + vSEnrollNumber + "','" + Convert.ToString(vYear) + "/" + String.Format("{0:D2}", vMonth) + "/" + String.Format("{0:D2}", vDay) + "','" + String.Format("{0:D2}", vHour) + ":" + String.Format("{0:D2}", vMinute) + "','" + bstatus + "')";

                        OleDbCommand cmd = new OleDbCommand(my_querry, conn);
                        cmd.ExecuteNonQuery();
                        Console.WriteLine("saved");                      
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show("Failed due to" + ex.Message);
                    }
                    finally
                    {
                        conn.Close();
                    }

关于调试 my_querry 我明白了:INSERT into punchMachineData (empID,date,time,bstatus) Values('1','2016/06/22','18:19','1')

我在异常中得到的错误是:INSERT INTO 语句中的语法错误

System.Data.OleDb.OleDbException (0x80040E14): Syntax error in INSERT INTO statement.
   at System.Data.OleDb.OleDbCommand.ExecuteCommandTextErrorHandling(OleDbHResult hr)
   at System.Data.OleDb.OleDbCommand.ExecuteCommandTextForSingleResult(tagDBPARAMS dbParams, Object& executeResult)
   at System.Data.OleDb.OleDbCommand.ExecuteCommandText(Object& executeResult)
   at System.Data.OleDb.OleDbCommand.ExecuteCommand(CommandBehavior behavior, Object& executeResult)
   at System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(CommandBehavior behavior, String method)
   at System.Data.OleDb.OleDbCommand.ExecuteNonQuery()

为什么我有它以及如何修复它?

列名称与屏幕截图中共享的列名称不同。

使用 -

INSERT into punchMachineData (empID,dates,times,bstatus)...

而不是 -

INSERT into punchMachineData (empID,date,time,bstatus)...

或者更改架构中的名称。

On a side note, such commands are prone to SqlInjection so suggest to use parameterized queries in place of plain sql statements.

需要将table名称和列名用方括号括起来

“插入 [punchMachineData]([empID]、[日期]、[时间]、[bstatus])……

其中的一部分,不要使用字符串连接来构建 sql 命令。 当您的输入中有单引号或者您是否有其他字段需要输入值的特定格式时,这种做法会导致语法错误。但最糟糕的是Sql注入

的问题

所以你的代码应该这样写:

INSERT into punchMachineData (empID,date,time,bstatus) Values
cmdInsert.CommandText = "INSERT INTO [punchMachineData ] (empID, date, time, bstatus) VALUES " + "(?,?,?,?)"
cmdInsert.Parameters.AddWithValue("@p1",pass param1 here)
cmdInsert.Parameters.AddWithValue("@p2",pass param2 here)
cmdInsert.Parameters.AddWithValue("@p3",pass param3 here)
cmdInsert.Parameters.AddWithValue("@p4",pass param4 here)
cmdInsert.Connection = cnnOLEDB
cmdInsert.ExecuteNonQuery()