我第一次在访问中创建了一个表格的名称是punchmachinedata 它具有以下列,其链接上给出的各自类型http://prntscr.com/bjxs2v
我创建一个动态插入查询:
string str = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:UsersSaraDesktoppunchMachineDataBase.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')
和错误我出现的例外是:插入到语句中的语法错误
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)...
或更改架构中的名称。
在旁注上,此类命令容易出现
SqlInjection
,因此建议使用 参数化查询代替普通SQL语句。
您需要用方括号封装表名和列名
"插入[punchmachinedata]([[empid],[date],[time],[bstatus])..................................
一个部分,请勿使用字符串comcatenation构建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()