werr 发表于 2015-1-6 08:25:19

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]
查看完整版本: ERROR [42000]