2010-12-22 48 views
1


我在插入Access 2010數據庫時遇到此異常。在C中插入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 

執行SQL插入查詢的代碼是:

insertSQL = "INSERT INTO CranbrookMain (ID,BlockNo,Plot,SubPlot,Code,Type,LastName," + 
      "FirstName,ServiceHome,ServiceAddress,ServiceCity,Notes) VALUES (" + 
      "'"+id+ "','" + blockNo + "','" + plot + "','" + subPlot + "','" + code + 
      "','" + type + "','" + lastname + "','" + firstname + "','" + serviceHome + 
      "','" + serviceAddress + "','" + serviceCity + "','" + notes +"')"; 

OleDbCommand cmd = new OleDbCommand(insertSQL, con); // creating query command 
cmd.ExecuteNonQuery(); 

cmd.ExecuteNonQuery()會出現錯誤函數調用。

上面的SQL INSERT語句工作正常,如果我直接在Access 2010文件中執行。

+0

在你的城市名字附近做什麼悲傷的笑臉? – Shoban 2010-12-22 17:42:31

+0

那是來自其中有二進制數據的文件。 – slao 2010-12-22 17:44:09

回答

1

使用參數化查詢,您不會遇到此問題,也不會公開SQL注入攻擊。

1

由於RedFilter說,你不應該像你這樣做構建你的SQL。
問題是您的Notes字段包含的數據沒有以數據庫驅動程序可以解析的方式正確表示。

如果您的任何值包含撇號,您會認爲會發生什麼? 舉例說,你正試圖保存一個記錄Mr O'Reilly生活在22 Queen's Road)?
你會在你的數據庫中得到垃圾,否則你會得到例外,或者更糟的是,有人可能很容易inject some SQL and hack your database

相反,這樣做:

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(); 
0
''CityName       ☺' 

它看起來像你的筆記變量包含apostophe>」 <讓您的SQL無效 類似

notes = "'CityName       ☺" 

由於@RedFilter和@Renaud Bompuis說「使用參數化查詢」而不是連接字符串