您的位置:程序门 -> .net技术 -> c#



访问informix数据库如果表中有gbk码时,出错!


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


访问informix数据库如果表中有gbk码时,出错!
发表于:2008-01-23 22:55:31 楼主
我是访问informix   9.4数据库,csdk   2.90   tc6
//connstr   =   "provider=ifxoledbc.2;password="   +   db_password   +   ";user   id="   +   db_user   +   ";data   source=alldb@"   +   db_name   +     ";persist   security   info=true";

datatable   selectedtable   =   new   datatable("selectedtable");
olecmd   =   new   oledbcommand(sqlcommandtext,   oleconn);
oledbdataadapter   oleda   =   new   oledbdataadapter(olecmd);
try
{
      oleda.fill(selectedtable);
      //如果遇到表中内容有字符是gbk码的字时,会出错;
      //如果表中的是gb2312码的字,一切正常
}
catch(exception   e)
{
      //e.message出现"由于符号不匹配或数据溢出以外的其他原因,未能转换数据值。例如,数据在数据存储区中已损坏,但该行仍可以检索。"
      //怎么处理?
}
发表于:2008-01-23 23:08:581楼 得分:0
哪位高手帮帮忙啊·!
发表于:2008-01-23 23:29:112楼 得分:0
友情支持
发表于:2008-01-24 00:17:123楼 得分:0
有没高手出来说句话啊?
发表于:2008-01-24 00:54:124楼 得分:0
没想到还有人用到了informix   9   ,小弟还在用7.3,我认为已经到顶了。
我认为可能不是字符类型的问题。试试在数据库中用sql语句查出错的那条记录。
unload   出错的数据,你用excel打开,分格符为 ¦,估计你会有所发现,字段会串行,这应该是原因吧。
可能:1   表中本身存在半角的字符,建议表中所有标点用全角或半角成双出现。
2   记录的某个字段的值最后一位存在一个全角的半个字。
也可以这样试试:   sql   select   的字段后你都加   .trim()
另一个只能研究编码了
gbk:   汉字国标扩展码,基本上采用了原來gb2312-80所有的汉字及码位,並涵盖了原unicode中所有的汉字20902,总共收录了883个符号,       21003个汉字及提供了1894个造字码位。       microsoft简体版中文windows       95就是以gbk为內码,又由于gbk同時也涵盖了unicode所有cjk汉字,所以也可以和unicode做一一对应。

gb码,全称是gb2312-80《信息交换用汉字编码字符集   基本集》,1980年发布,是中文信息处理的国家标准,在大陆及海外使用简体中文的地区(如新加坡等)是强制使用的唯一中文编码。p-windows3.2和苹果os就是以gb2312为基本汉字编码,   windows   95/98则以gbk为基本汉字编码、但兼容支持gb2312。gb码共收录6763个简体汉字、682个符号,其中汉字部分:一级字3755,以拼音排序,二级字3008,以偏旁排序。该标准的制定和应用为规范、推动中文信息化进程起了很大作用。

gbk编码是中国大陆制订的、等同于ucs的新的中文编码扩展国家标准。gbk工作小组于1995年10月,同年12月完成gbk规范。该编码标准兼容gb2312,共收录汉字21003个、符号883个,并提供1894个造字码位,简、繁体字融于一库。

汉字转化成gbk码程序
原链接:http://www.boy5d.com/article/html/2007-11/373.html

using   system;
using   system.data;
using   system.configuration;
using   system.collections;
using   system.web;
using   system.web.security;
using   system.web.ui;
using   system.web.ui.webcontrols;
using   system.web.ui.webcontrols.webparts;
using   system.web.ui.htmlcontrols;
using   system.text;

public   partial   class   getgbk_code_server   :   system.web.ui.page
{
          string   data   =   "";
          protected   void   page_load(object   sender,   eventargs   e)
          {
                  data   =   request.querystring["content"];
                  string   content   =   getnumber();
                  string   result1   =   "";
                  int   len   =   content.length;
                          for   (int   i   =   0;   i   <=   len   -   1;   i   =   i   +   3)
                          {
                                  string   temp   =   content.substring(0,   3);
                                  content   =   content.substring(3);
                                  result1   =   result1   +   trans(int.parse(temp));
                          }
                          response.write(result1);
       
             
          }
          string   trans(int   n)
          {
                  string   result   =   "";
                  int[]   store;
                  store   =   new   int[100];
                  int   tmp1   =   n,   tmp2;
                  int   i   =   0;
                  if   (n   <   16)
                  {
                          store[i]   =   n;
                  }
                  while   (tmp1   > =   16)                           //循环取余数
                  {
                          tmp2   =   tmp1   %   16;
                          tmp1   =   tmp1   /   16;
                          store[i++]   =   tmp2;
                          if   (tmp1   <=   16)
                                  store[i]   =   tmp1;
                  }
                  for   (int   j   =   i;   j   > =   0;   j--)                   //余数的倒序输出
                  {
                          if   (store[j]   <   10)
                          {
                                  result   =   result   +   store[j].tostring();
                          }
                          else
                          {
                                  switch   (store[j])           //16进制中的字母所代表的数字  
                                  {
                                          case   10:   result   =   result   +   "a";   break;
                                          case   11:   result   =   result   +   'b';   break;
                                          case   12:   result   =   result   +   'c';   break;
                                          case   13:   result   =   result   +   'd';   break;
                                          case   14:   result   =   result   +   'e';   break;
                                          case   15:   result   =   result   +   'f';   break;
                                  }
                          }
                  }
                  return   result;
          }
          string   getnumber()
          {
                  encoding   ed   =   encoding.getencoding("gbk");
                  byte[]   bytecontent   =   ed.getbytes(data);
                  string   ecode   =   "";
                  for(int   i   =   0;   i   <   bytecontent.length;   i++)
                  {
                          ecode   +=   bytecontent[i].tostring();
                  }
                  return   ecode;
          }
}


发表于:2008-01-24 01:29:245楼 得分:0
很感谢lonelygames兄弟;

可能:
1       表中本身存在半角的字符,建议表中所有标点用全角或半角成双出现。  
      答:表中不存在任何标点符号;
2       记录的某个字段的值最后一位存在一个全角的半个字。  
      答:表中的一个字符串字段中存在一个gbk汉字,我专门填了一个gbk汉字来测试,例如:沖;
3     也可以这样试试:       sql       select       的字段后你都加       .trim()  
      答:我的sql语句绝对没有问题,因为我只要把那个测试汉字一去掉就一切正常的执行了;

总结:我发现是在   oleda.fill(selectedtable)   时出错的,严重怀疑是否为oleda.fill()函数不支持gbk,我现在不是转换不了gbk编码的问题,而是这个有gbk乱码的字符串的字段值我根本就取不出来,能取出来既使是乱码都可以,就一切都好办了。

发表于:2008-01-24 01:30:356楼 得分:0
oleda.fill()   就是   oledbdataadapter.fill()


快速检索

最新资讯
热门点击