2014-05-05 154 views
-1

我的軟件生成一個查詢,插入我的Access數據庫,而是來自我的代碼查詢,生成System.Data.OleDb.OleDbException,與附加信息:.OleDbException語法錯誤INSERT INTO語句中

語法錯誤在INSERT INTO語句中。

調試代碼,生成的查詢工作正常,如果我嘗試通過Access軟件insert

我真的不知道爲什麼我得到這個異常,我的查詢很好!

代碼:

OleDbConnection commodityDB = null; 

try 
{ 
    commodityDB = new OleDbConnection(connector); 
    Console.WriteLine("Microsoft DB Connected!"); 
} 
catch (Exception ex) 
{ 
    Console.WriteLine("Error: Failed to create a database connection. \n{0}", ex.Message); 
    return; 
} 

OleDbCommand cmder = new OleDbCommand(insert_txt,commodityDB); 

string insert = string.Format("INSERT INTO Comm2 (Commodity_Name, Month_Code, Year_Com, ComCode, TradeDate,Open,High,Low,Close,Vol,OI) VALUES ('{0}','{1}','{2}','{3}','{4}','{5}','{6}','{7}','{8}','{9}','{10}')", comName, comMonth, comYear, parts[0], parts[2], parts[3], parts[4], parts[5], parts[6], parts[7], parts[8]); 

commodityDB.Open(); 

cmder.CommandText = insert; 
cmder.ExecuteNonQuery(); 
myAccessConn.Close(); 

生成的查詢的一個例子:

INSERT INTO Comm2 (Commodity_Name, Month_Code, Year_Com, ComCode, TradeDate, Open, High, Low, Close, Vol, OI) 
VALUES ('Australian Dollar', 'Y', '0', 'A6', '04/28/2014', '92740', '93157', '92435', '92568', '0', '0') 

它工作正常!不是在軟件上。

回答

0

首先,我會選擇使用OleDbParameters而不是string.Format來構造您的查詢。這樣您就不必擔心包含引號的字符串或其他任何可能導致SQL無效的字符串。查看OleDbCommand的Prepare method,查看使用參數進行INSERT查詢的示例,就像您試圖實現的那樣。

在你的例子中,雖然我不確定你的insert_txt變量是指什麼,但是由於你好像覆蓋了那個值,所以我將它從構造函數中排除,並且只會在你得到的時候構造你的cmder變量您的insert變量設置正確。嘗試如下所示;

string insert = string.Format("INSERT INTO Comm2 (Commodity_Name, Month_Code, Year_Com, ComCode, TradeDate,Open,High,Low,Close,Vol,OI) VALUES ('{0}','{1}','{2}','{3}','{4}','{5}','{6}','{7}','{8}','{9}','{10}')", comName, comMonth, comYear, parts[0], parts[2], parts[3], parts[4], parts[5], parts[6], parts[7], parts[8]); 

OleDbCommand cmder = new OleDbCommand(insert,commodityDB); 


commodityDB.Open(); 

// cmder.CommandText = insert; // You probably won't need this anymore. 
cmder.ExecuteNonQuery(); 
myAccessConn.Close(); 
+0

工作!事實上,使用不同的變量初始化OleDbCommand是我的錯誤。關於SQL Injection,我知道風險,但是這個軟件將在一個安全的地方在本地工作。 –

+0

非常好。這不僅僅是關於SQL注入。如果在某一點上,你正在讀取一個包含引用字符的有效Commodity_Name(例如,澳大利亞人的Dollar:不好的例子,但你知道這是一個真正的可能性而不是惡意攻擊)呢?這將打破你的字符串格式,然後SQL命令。參與使用參數只是一個好習慣,然後你會基本上做到這一點,因爲你習慣了。 –