2014-05-05 136 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命令。参与使用参数只是一个好习惯,然后你会基本上做到这一点,因为你习惯了。 –