我第一次在Access中创建了一个表,它的名字是punchMachineData 它在链接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()
为什么我拥有它以及如何解决它?
答案 0 :(得分:1)
列名称与屏幕截图中共享的列名称不同。
使用 -
INSERT into punchMachineData (empID,dates,times,bstatus)...
而不是 -
INSERT into punchMachineData (empID,date,time,bstatus)...
或者更改架构中的名称。
另外,这些命令很容易
SqlInjection
,因此建议使用 参数化查询代替普通的sql语句。
答案 1 :(得分:0)
您需要使用方括号
封装表名和列名“INSERT into [punchMachineData]([empID],[date],[time],[bstatus])......
此处的一部分,不要使用字符串cancatenation来构建sql命令。 当您在输入中有单引号或者您有其他需要输入值特定格式的字段时,这种做法会导致语法错误。但最糟糕的是Sql Injection的问题
所以你的代码应该用这种方式编写:
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()