访问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#