Tags
ORA-00917
, 缺少逗号
, 字符集
,ZHS16GBK
,Ø
错误表现
使用c#编码,程序中获得Webservice抽取来的数据进行拼接SQL执行时,有时出现ORA-00917 缺少逗号的错误提示。
而该代码生成的SQL,拿到PL/SQL Developer中执行是没问题的。
问题原因
经过一定时间排查,发现这些数据中存在一些特殊符号,在程序中进行SQL拼接时,特殊符号直接就拼接进字符串中。
而将SQL拿到PL/SQL Developer中执行时,实际上已经转换成了可识别的编码格式,比如特殊符号直接转换成了“?"
所以执行不会产生问题。
其根本原因是外部数据中存在数据库字符集中不存在的字符。
例如ZHS16GBK字符集中不存在
Ø
符号。
在PL/SQL Developer中修改数据加入Ø
符号
点击提交后会自动变为?
解决方案
使用Encoding.GetString
在程序中将字符串转换成GBK编码字符串。
value = value.Trim().Replace((char)160, ' ');
value = Encoding.GetEncoding("GBK").GetString(Encoding.Default.GetBytes(value));
即可避免报错。
缺陷
该方法缺陷在于特殊字符变成了?
,无法正常显示字符意义。最终解决方案还是应该从数据库字符集着手。