ERROR [42000]
出错环境:windows server 2003+sqlserver2008 r2+odbc32出错详情:System.Data.Odbc.OdbcException:ERROR
字符串'7'后的引号不完整
如图:
SQL语句如右:insert into 测试('张三','7 7 7 7 0 6 8','13580891274');
初步处理:
因为我写的程序,在执行insert语句,如果失败了,我把SQL语句写到了日志中。
所以,我在日志中,将这个执行失败的sql语句,手动复制到sqlserver 2008 中执行,成功了。
--------
那么问题就来了,为什么明明成功的sql语句,自己写程序会执行报错呢?
问题查询:
第一肯定是搜索问题,如果你搜索 ERROR ,很多大神会告诉你,这是保留字问题。
但是sql语句我手动复制到sqlserver2008能执行,所以排除。
深入思考:
到这里我们就得开始考虑字符问题了,毕竟表面上我们看到的没有任何问题,而且复制到sqlserver中也能执行。很多浮躁的哥们,肯定又开始骂微软,或者开始考虑是不是sqlserver的bug了。
1,我将日志的sql语句【日志写出来的sql不能编辑,否则看不到原始的字符编码】,用UltraEdit打开,发现电话号码的字符既然有00,如图:
再来看看 文本文档显示的情况:
在文本文档中,00显示既然和空格无异。
【ps:00在windows表示中断,如果对00有更深的描述,欢迎留言指正】
解决问题:
既然问题发现了,那么解决就好办了,只需要把电话号码中的00编码去掉,即可。
替换方法[写的一个替换方法]
static string StrSqlReplace(string oldString)
{
if (oldString == null || oldString.Trim() == "") return "";
string str = string.Empty;//要返回的字符串
byte[] bytes = Encoding.UTF8.GetBytes(oldString);
string[] strArr = new string;
string test = null;
try
{
for (int i = 0; i < bytes.Length; i++)
{
string temp = bytes.ToString("x");
if (temp.Length <= 1 || temp == "00" || temp == "27" || temp == "2c")
{
strArr = "20";
}
else
{
strArr = temp;
}
test += temp + ":";
}
for (int i = 0; i < strArr.Length; i++)
{
bytes = byte.Parse(strArr, System.Globalization.NumberStyles.HexNumber);
}
str = Encoding.UTF8.GetString(bytes);
}
catch (Exception ex)
{
StaticPass.WriteLog("出错:原字符串:" + oldString + "十六进制:" + test + "翻译后字符串:" + str, ex);
throw;
}
return str.Replace("'", "");
}
页:
[1]