Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在C夏普中插入Access 2010时出现异常_C#_Ms Access_Exception - Fatal编程技术网

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                          ☺"