c#+oracle数据库开发过程中遇到的字符集问题 数据库字符集是ZHS16GBK,客户端字符集也是,在sqlplus里insert汉字,select 出来没问题,但是在C#里insert汉字,select出来都变成问号了,.net采用unicode,怎么处理才能正确插入到oracle里呢? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 把select 出来的东西转换编码试试。using System;using System.Text;namespace Test{ /// <summary> /// 转换编码类的实现 /// 2005-8-25 /// </summary> public class clsConvert { private clsConvert() { // // TODO: 在此处添加构造函数逻辑 // } /// <summary> /// 转换编码 /// </summary> /// <param name="str">输入的字符</param> /// <param name="Oldstyle">原来的编码</param> /// <param name="Newstyle">目标编码</param> /// <returns>返回转换后的字符</returns> public static string m_mthConverUnicode(string str,UnicodeStyle Oldstyle,UnicodeStyle Newstyle) { Encoding UnicodeOld = m_mthGetEncoding(Oldstyle); Encoding UnicodeNew =m_mthGetEncoding(Newstyle); byte[] OldBytes = UnicodeOld.GetBytes(str); byte[] NewBytes = Encoding.Convert(UnicodeOld, UnicodeNew, OldBytes); char[] NewChars = new char[UnicodeNew.GetCharCount(NewBytes, 0, NewBytes.Length)]; UnicodeNew.GetChars(NewBytes, 0, NewBytes.Length, NewChars, 0); string NewString = new string(NewChars); return NewString; } /// <summary> /// 转换编码 /// </summary> /// <param name="str">输入的字符</param> /// <param name="style">目标编码</param> /// <returns>返回转换后的字符</returns> public static string m_mthConverUnicode(string str,UnicodeStyle style) { Encoding UnicodeOld = Encoding.Default; Encoding UnicodeNew = m_mthGetEncoding(style); byte[] OldBytes = UnicodeOld.GetBytes(str); byte[] NewBytes = Encoding.Convert(UnicodeOld, UnicodeNew, OldBytes); char[] NewChars = new char[UnicodeNew.GetCharCount(NewBytes, 0, NewBytes.Length)]; UnicodeNew.GetChars(NewBytes, 0, NewBytes.Length, NewChars, 0); string NewString = new string(NewChars); return NewString; } /// <summary> /// 转换编码 /// </summary> /// <param name="str">输入的字符</param> /// <returns>返回转换成UTF8后的字符</returns> public static string m_mthConverUnicode(string str) { Encoding UnicodeOld = Encoding.Default; Encoding UnicodeNew = Encoding.UTF8; byte[] OldBytes = UnicodeOld.GetBytes(str); byte[] NewBytes = Encoding.Convert(UnicodeOld, UnicodeNew, OldBytes); char[] NewChars = new char[UnicodeNew.GetCharCount(NewBytes, 0, NewBytes.Length)]; UnicodeNew.GetChars(NewBytes, 0, NewBytes.Length, NewChars, 0); string NewString = new string(NewChars); return NewString; } //I asked Postoffice already,but it's water carriage. So It will arrive after one or two Months .or I send the Image for Now? private static Encoding m_mthGetEncoding(UnicodeStyle style) { Encoding ret ; switch(style) { case UnicodeStyle.ASCII: ret =Encoding.ASCII; break; case UnicodeStyle.BigEndianUnicode: ret =Encoding.BigEndianUnicode; break; case UnicodeStyle.Unicode: ret =Encoding.Unicode; break; case UnicodeStyle.UTF7: ret =Encoding.UTF7; break; case UnicodeStyle.UTF8: ret =Encoding.UTF8; break; default: ret =Encoding.Default; break; } return ret; } } /// <summary> /// 字符集的编码 /// </summary> public enum UnicodeStyle { /// <summary> /// ASCII(7 位)字符集的编码 /// </summary> ASCII, /// <summary> /// 采用 Big-Endian 字节顺序的 Unicode 格式的编码 /// </summary> BigEndianUnicode, /// <summary> /// 系统的当前 ANSI 代码页的编码 /// </summary> Default, /// <summary> /// 采用 Little-Endian 字节顺序的 Unicode 格式的编码 /// </summary> Unicode, /// <summary> /// UTF-7 格式的编码 /// </summary> UTF7, /// <summary> /// UTF-8 格式的编码 /// </summary> UTF8 }} 哥们,可以给我一段C#和Oracle地连接程序吗?我这里现在Oracle装在服务器上,我想从服务器上的某个数据库里读个表出来(我以前做SQL和C#对Oracle不熟悉) 现在客户端和服务器都是ZHS16GBK,该怎么使用这个类进行转换呢? 我用的是SYBASE,服务器端是Latin_1编码,有也这个问题,我的方法是,把String类型用cp936编码,然后用字符数组的形式传入服务器就好了.程序如下:private byte[] TranslateChineseStr(string str) { //由于编码原因,要将中文字符串重新编码,936为中文代码页 System.Text.Encoding encoding = System.Text.Encoding.GetEncoding(936); return encoding.GetBytes(str); }使用(不是实际代码,只是示意一下用法,各种调用不一定对,你可以根据实际情况修改):OdbcCommand cmd = new OdbcCommand(odbcConn);cmd.CommandText = "insert into t1 (text_1) value (?)";cmd.Parameters.Add("text1",OdbcType.Binary);//注意此处一定要是Binary类型,但在数据库中是CHARcmd.Parameters["text1"].Value = TranslateChineseStr("示例");select出来的时候不需要做转换 十分关注。我当时遇到这种情况,找了很多资料试了很多方法都没有解决,后来只好重装ORACLE 我的方法在sybase上完全可用,不知道oracle怎么样,楼主试试吧.如果不行的话,在插入前把字符串编码转为GBK,然后再做为字符串插入,应该可以的. 把你的连接字符串加上字符集就可以了,比如CharSet = --- 我一直用。net+oracle ,没碰到啊。不行就用代码转换字符集了=============================== msn:[email protected] 监听函数listen迷惑 C# Treeview請有經驗的幫忙實現一下 请教一下全局钩子,DEMO运行通过,但加个FORM就不行了 c# 部署问题 tabcontrol的问题 一个难度极高的问题,大虾们进,关于设置cookie 如何将以下vb自定义类型代码转成 c#代码. 急 ,如何取一个变量的长度? 如何识别rtf中的图片 c# 调用c++api 参数类型? (在线等) 有关datagrid与文本框绑定,增加记录后用SqlDataAdapter更新数据库 C#做的exe文件,运行时出现错误
using System.Text;
namespace Test
{
/// <summary>
/// 转换编码类的实现
/// 2005-8-25
/// </summary>
public class clsConvert
{
private clsConvert()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
/// <summary>
/// 转换编码
/// </summary>
/// <param name="str">输入的字符</param>
/// <param name="Oldstyle">原来的编码</param>
/// <param name="Newstyle">目标编码</param>
/// <returns>返回转换后的字符</returns>
public static string m_mthConverUnicode(string str,UnicodeStyle Oldstyle,UnicodeStyle Newstyle)
{
Encoding UnicodeOld = m_mthGetEncoding(Oldstyle);
Encoding UnicodeNew =m_mthGetEncoding(Newstyle);
byte[] OldBytes = UnicodeOld.GetBytes(str);
byte[] NewBytes = Encoding.Convert(UnicodeOld, UnicodeNew, OldBytes);
char[] NewChars = new char[UnicodeNew.GetCharCount(NewBytes, 0, NewBytes.Length)];
UnicodeNew.GetChars(NewBytes, 0, NewBytes.Length, NewChars, 0);
string NewString = new string(NewChars);
return NewString;
}
/// <summary>
/// 转换编码
/// </summary>
/// <param name="str">输入的字符</param>
/// <param name="style">目标编码</param>
/// <returns>返回转换后的字符</returns>
public static string m_mthConverUnicode(string str,UnicodeStyle style)
{
Encoding UnicodeOld = Encoding.Default;
Encoding UnicodeNew = m_mthGetEncoding(style);
byte[] OldBytes = UnicodeOld.GetBytes(str);
byte[] NewBytes = Encoding.Convert(UnicodeOld, UnicodeNew, OldBytes);
char[] NewChars = new char[UnicodeNew.GetCharCount(NewBytes, 0, NewBytes.Length)];
UnicodeNew.GetChars(NewBytes, 0, NewBytes.Length, NewChars, 0);
string NewString = new string(NewChars);
return NewString;
}
/// <summary>
/// 转换编码
/// </summary>
/// <param name="str">输入的字符</param>
/// <returns>返回转换成UTF8后的字符</returns>
public static string m_mthConverUnicode(string str)
{
Encoding UnicodeOld = Encoding.Default;
Encoding UnicodeNew = Encoding.UTF8;
byte[] OldBytes = UnicodeOld.GetBytes(str);
byte[] NewBytes = Encoding.Convert(UnicodeOld, UnicodeNew, OldBytes);
char[] NewChars = new char[UnicodeNew.GetCharCount(NewBytes, 0, NewBytes.Length)];
UnicodeNew.GetChars(NewBytes, 0, NewBytes.Length, NewChars, 0);
string NewString = new string(NewChars);
return NewString;
}
//I asked Postoffice already,but it's water carriage. So It will arrive after one or two Months .or I send the Image for Now?
private static Encoding m_mthGetEncoding(UnicodeStyle style)
{
Encoding ret ;
switch(style)
{
case UnicodeStyle.ASCII:
ret =Encoding.ASCII;
break;
case UnicodeStyle.BigEndianUnicode:
ret =Encoding.BigEndianUnicode;
break;
case UnicodeStyle.Unicode:
ret =Encoding.Unicode;
break;
case UnicodeStyle.UTF7:
ret =Encoding.UTF7;
break;
case UnicodeStyle.UTF8:
ret =Encoding.UTF8;
break;
default:
ret =Encoding.Default;
break;
}
return ret; }
}
/// <summary>
/// 字符集的编码
/// </summary>
public enum UnicodeStyle
{
/// <summary>
/// ASCII(7 位)字符集的编码
/// </summary>
ASCII,
/// <summary>
/// 采用 Big-Endian 字节顺序的 Unicode 格式的编码
/// </summary>
BigEndianUnicode,
/// <summary>
/// 系统的当前 ANSI 代码页的编码
/// </summary>
Default,
/// <summary>
/// 采用 Little-Endian 字节顺序的 Unicode 格式的编码
/// </summary>
Unicode,
/// <summary>
/// UTF-7 格式的编码
/// </summary>
UTF7,
/// <summary>
/// UTF-8 格式的编码
/// </summary>
UTF8 }
}
我这里现在Oracle装在服务器上,我想从服务器上的某个数据库里读个表出来
(我以前做SQL和C#对Oracle不熟悉)
{
//由于编码原因,要将中文字符串重新编码,936为中文代码页
System.Text.Encoding encoding = System.Text.Encoding.GetEncoding(936);
return encoding.GetBytes(str);
}使用(不是实际代码,只是示意一下用法,各种调用不一定对,你可以根据实际情况修改):
OdbcCommand cmd = new OdbcCommand(odbcConn);
cmd.CommandText = "insert into t1 (text_1) value (?)";
cmd.Parameters.Add("text1",OdbcType.Binary);//注意此处一定要是Binary类型,但在数据库中是CHAR
cmd.Parameters["text1"].Value = TranslateChineseStr("示例");select出来的时候不需要做转换
如果不行的话,在插入前把字符串编码转为GBK,然后再做为字符串插入,应该可以的.
msn:[email protected]