Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.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# INSERT INTO语句中的.OLEDBEException语法错误_C#_Sql_.net - Fatal编程技术网

C# INSERT INTO语句中的.OLEDBEException语法错误

C# INSERT INTO语句中的.OLEDBEException语法错误,c#,sql,.net,C#,Sql,.net,我的软件生成一个要插入Access数据库的查询,但来自我的代码的查询会生成一个System.Data.OleDb.OleDbException,其中包含其他信息: INSERT INTO语句中出现语法错误 通过调试代码,如果我尝试通过Access软件插入,生成的查询可以正常工作 我真的不知道为什么会出现这种异常,我的查询很好 代码: 生成的查询示例如下: INSERT INTO Comm2 (Commodity_Name, Month_Code, Year_Com, ComCode, Trade

我的软件生成一个要插入Access数据库的查询,但来自我的代码的查询会生成一个
System.Data.OleDb.OleDbException
,其中包含其他信息:

INSERT INTO语句中出现语法错误

通过调试代码,如果我尝试通过Access软件插入,生成的查询可以正常工作

我真的不知道为什么会出现这种异常,我的查询很好

代码:

生成的查询示例如下:

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')

很好用!但软件上没有。

首先,我选择使用OLEDB参数而不是string.Format来构造查询。这样,您就不必担心包含引号的字符串或任何可能使SQL无效的其他内容。查看OleDbCommand的示例,了解如何使用参数进行插入查询,就像您试图实现的那样

不过,在您的示例中,我不确定
insert\u txt
变量指的是什么,但如果您似乎正在覆盖该值,我会将其从构造函数中排除,并仅在正确设置
insert
变量后才构造
cmder
变量。尝试下面的方法

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();

成功了!事实上,用不同的变量初始化OleDbCommand是我的错误。关于SQL注入,我知道风险,但是这个软件将在本地安全的地方工作。非常好。但这不仅仅是SQL注入的问题。如果在某个时候,你正在阅读一个包含引号字符的有效商品名称(即澳大利亚元:坏例子,但只是为了让你知道这是真正的可能性而不是恶意攻击),该怎么办?这将破坏您的字符串格式,然后是SQL命令。这只是一个好习惯,开始使用参数,然后你基本上会这样做,因为你已经习惯了。
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();