当前位置:编程学习 > C#/ASP.NET >>

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

我是访问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出现"由于符号不匹配或数据溢出以外的其他原因,未能转换数据值。例如,数据在数据存储区中已损坏,但该行仍可以检索。"
   //怎么处理?
} --------------------编程问答-------------------- 哪位高手帮帮忙啊·! --------------------编程问答-------------------- 友情支持 --------------------编程问答-------------------- 有没高手出来说句话啊? --------------------编程问答-------------------- 没想到还有人用到了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;
     }
}





--------------------编程问答-------------------- 很感谢lonelygames兄弟;

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

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

--------------------编程问答-------------------- oleDA.Fill() 就是 OleDbDataAdapter.Fill() --------------------编程问答-------------------- 应该可以怀疑 oledb 不支持.
那么你可以试试用ODBC来联一下.看能否行得通.
--------------------编程问答-------------------- oledb 有没有什么升级补丁? --------------------编程问答-------------------- 可以看你的informix cli 是哪个版本的吧!
不知道有没有9.4 ,我现在用的是9.2. --------------------编程问答-------------------- 看样子,这个问题有点偏了,好像没有哪位遇到过
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,