数据库字符集是ZHS16GBK,客户端字符集也是,在sqlplus里insert汉字,select 出来没问题,但是在C#里insert汉字,select出来都变成问号了,.net采用unicode,怎么处理才能正确插入到oracle里呢?
 

解决方案 »

  1.   

    把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 }
    }
      

  2.   

    哥们,可以给我一段C#和Oracle地连接程序吗?
    我这里现在Oracle装在服务器上,我想从服务器上的某个数据库里读个表出来
    (我以前做SQL和C#对Oracle不熟悉)
      

  3.   

    现在客户端和服务器都是ZHS16GBK,该怎么使用这个类进行转换呢?
      

  4.   

    我用的是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类型,但在数据库中是CHAR
    cmd.Parameters["text1"].Value = TranslateChineseStr("示例");select出来的时候不需要做转换
      

  5.   

    十分关注。我当时遇到这种情况,找了很多资料试了很多方法都没有解决,后来只好重装ORACLE
      

  6.   

    我的方法在sybase上完全可用,不知道oracle怎么样,楼主试试吧.
    如果不行的话,在插入前把字符串编码转为GBK,然后再做为字符串插入,应该可以的.
      

  7.   

    把你的连接字符串加上字符集就可以了,比如CharSet = ---
      

  8.   

    我一直用。net+oracle ,没碰到啊。不行就用代码转换字符集了===============================
     
      msn:[email protected]