C#使用OleDb读取Excel时,特殊字符工作表名引发FROM子句语法错误的问题咨询
解决OleDb读取带特殊字符Excel工作表的语法错误问题
这个问题的根源在于你的工作表名包含了空格和点号这类OleDb SQL语法中的特殊字符,直接拼接进SQL语句后,解析器会把它们当成语法的一部分,而不是表名的组成部分,自然就抛出了Syntax error in FROM clause异常。
原来的sheet1没有特殊字符,所以[sheet1$]的写法能被正确识别,但换成topos .architectures. bureaux后,拼接出来的[topos .architectures. bureaux$]会让OleDb误以为点号是对象分隔符、空格是语法分隔,导致解析失败。
解决方法
你需要用单引号把整个工作表名(包括末尾的$)包裹起来,再放到方括号中,这样OleDb就能正确识别这个带特殊字符的表名了。修改后的代码如下:
string sheetName = "topos .architectures. bureaux"; try { string stringConnection = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=excelfile.xls;Extended Properties='Excel 12.0;HDR=Yes;IMEX=1;MAXSCANROWS=0';"; using (OleDbConnection OleDbConnection_ = new OleDbConnection(stringConnection)) using (OleDbCommand OleDbCommand_ = new OleDbCommand("select * from ['" + sheetName + "$']; ", OleDbConnection_)) { OleDbConnection_.Open(); DataTable DataTable_ = new DataTable(); DataTable_.Load(OleDbCommand_.ExecuteReader(), LoadOption.OverwriteChanges); } } catch (Exception) { throw; }
另外额外提一句:我给代码加上了using语句,这样能自动释放数据库连接和命令对象,避免资源泄漏,比手动调用Close()更可靠。
补充提醒
虽然这里是你自己控制的工作表名,但如果未来sheetName来自外部输入,直接拼接SQL会有注入风险。不过对于Excel的OleDb查询,表名无法通过参数化查询来绑定,所以一定要确保sheetName的来源是安全可信的。
内容的提问来源于stack exchange,提问作者Eddayfy
相关产品推荐
相关产品推荐

