C# 在C夏普中插入Access 2010时出现异常
C# 在C夏普中插入Access 2010时出现异常,c#,ms-access,exception,C#,Ms Access,Exception,我在插入Access 2010数据库时遇到此异常 例如,以下内容: INSERT INTO CranbrookMain ( ID,BlockNo,Plot,SubPlot,Code,Type,LastName,FirstName, ServiceHome,ServiceAddress,ServiceCity, Notes ) VALUES ( '1','Y','37','DS','C2','O','SMITH','John',
我在插入Access 2010数据库时遇到此异常 例如,以下内容:
INSERT INTO CranbrookMain (
ID,BlockNo,Plot,SubPlot,Code,Type,LastName,FirstName,
ServiceHome,ServiceAddress,ServiceCity,
Notes
) VALUES (
'1','Y','37','DS','C2','O','SMITH','John',
'Service Inc.','520B SLATER ROAD N.W.','CityName',
'CityName ☺ '
)
例外情况下的结果:
Ex: System.Data.OleDb.OleDbException (0x80040E14):
Syntax error in string in query expression ''CityName ☺'.
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()
at ReadingData.Program.Main(String[] args) in C:\Users\user\documents\visual studio 2010\Projects\ReadingData\ReadingData\Program.cs:line 238
该错误发生在cmd.ExecuteNonQuery()
函数调用中
如果我直接在Access 2010文件中执行,上面的SQL INSERT语句就可以正常工作。使用参数化查询,您将不会出现此问题,也不会受到SQL注入攻击。正如RedFilter所说,您不应该以这样的方式构造SQL。
问题在于
Notes
字段包含的数据没有以数据库驱动程序可以解析的方式正确表示
如果你的任何一个值包含撇号,你认为会发生什么?
比如说,你正试图为住在皇后大道22号的O'Reilly先生保存一份记录?您要么在数据库中得到垃圾,要么得到异常,或者,更糟糕的是,有人很容易得到 相反,请执行以下操作:
insertSQL = "INSERT INTO CranbrookMain (ID,BlockNo,Plot,SubPlot,Code,Type,"
+ "LastName,FirstName,ServiceHome,ServiceAddress,ServiceCity,Notes) "
+ "VALUES (?,?,?,?,?,?,?,?,?,?,?,?)";
OleDbCommand cmd = new OleDbCommand(insertSQL, con);
cmd.Parameters.Add("ID", OleDbType.Integer).Value = id;
cmd.Parameters.Add("BlockNo", OleDbType.Char, 2).Value = blockNo;
cmd.Parameters.Add("Plot", OleDbType.Char, 3).Value = plot;
cmd.Parameters.Add("SubPlot", OleDbType.Char, 3).Value = subPlot;
cmd.Parameters.Add("Code", OleDbType.Char, 3).Value = code;
cmd.Parameters.Add("Type", OleDbType.Char, 3).Value = type;
cmd.Parameters.Add("LastName",OleDbType.Char, 50).Value = lastname;
cmd.Parameters.Add("FirstName", OleDbType.Char, 64).Value = firstname;
cmd.Parameters.Add("ServiceHome", OleDbType.Char, 50).Value = serviceHome;
cmd.Parameters.Add("ServiceAddress", OleDbType.Char, 128).Value = serviceAddress;
cmd.Parameters.Add("ServiceCity", OleDbType.Char, 50).Value = serviceCity;
cmd.Parameters.Add("Notes", OleDbType.Char, 255).Value = notes;
cmd.ExecuteNonQuery();
notes变量似乎包含一个撇号>“<使SQL无效
差不多
notes = "'CityName ☺"
正如@RedFilter和@Renaud Bompuis所说的,“使用参数化查询”而不是串接字符串在你的城市名称附近,悲伤的笑脸在干什么?这是来自一个包含二进制数据的文件。文件???Yo正在传递city的文件???+1@RedFilter给出了答案,您提供了代码示例
''CityName ☺'
notes = "'CityName ☺"