因为要读多个Oracle服务器,他们的字符集不一样(us7ascii ZHS16GBK ).需要将us7ascii 的服务器数据导入到ZHS16GBK 中.原来计划用程序转,失败.
修改注册表过字符集需要重启机器,在程序中也是不可行的.于是决定通过安装两个Oralce客户端,两个客户端指定不同的字符集来完成.
但是在C#程序中怎么指定选择一个客户端啊.toad plsql 等工具都有选择Oracle Home的地方>
在程序中怎么处理呢?

解决方案 »

  1.   

    us7ascii 的字符, 在C#是转不了的..
    我用过一个循环试过所有的字符集,,
    转出来的 byte[] 数组 大都是??
    不是?? 的几个都特别试了, 不行
      

  2.   

    string ConnectionString="Data Source=sky;user=system;password=manager;";既然是多个服务器,在连接时指定不同的SID可行?
      

  3.   

    SID 说的是 数据库的服务器端吧,,,,
    该机器上只是装了多个客户端,没有服务器端.
      

  4.   


    是不是你的C#程序有问题啊?
    怎么会转不了?〉
    是用 Encoding.Convert 吗?
      

  5.   


    客户段连接服务器,必须在tnsname.ora文件里配置服务器的SID,配置好后在客户段就可以使用了.
      

  6.   

    个人感觉楼主的这个思路有问题:
    1.oracle的连接主要是根据本地命名服务,就是tns来连接,你装多个客户端如果在一台机器上实际上是没意义的,影响最大的是环境变量,并不是你ORACLE_HOME的变化能决定的,实际上估计你两个ORACLE_HOME下tnsname不同,间接影响了你连接不同的数据库.实际上一个ORACLE_HOME的tns完全能指定两个不同的连接.
    2.即使你有两个库的连接,在不同字符集之间数据处理仍需要转换,这一步是不可能饶开的.
    3.修改注册表是整体的环境变量变化,实际上你只需要当前会话的环境变量变化,命令行下可以通过set(windows系统)或export(unix系统)来达到目的,对于c#中环境变量的变化方式不熟悉,不发表评论.应该有类似方法.
    4.字符集转换要考虑子集和超集的问题,反向转换是不可行的.
      

  7.   

    不是,没有连接客户端这么一说啊,你是想通过客户端作为中间件获取客户端得到的数据吧
    C#应该可以转化的啊,
    C#中的编码转换时间:2009-06-21 20:41:00来源:网络 作者:未知 点击:115次 
    好长时间没有写编码转换.今天写了下特地放上来供大家以后用到就不用去找了.
     
    将一个字符串转换成Unicode类型的Base64编码的字符串如下:
    Convert.ToBase64String(Encoding.Unicode.GetBytes(unicodeString));
    红色标明的
    好长时间没有写编码转换.今天写了下特地放上来供大家以后用到就不用去找了. 将一个字符串转换成Unicode类型的Base64编码的字符串如下:Convert.ToBase64String(Encoding.Unicode.GetBytes(unicodeString));红色标明的是还可以转换BigEndianUnicode(UTF-16),UTF-7,UTF-8,ASCII的几种编码. 那如何转换回来呢?Encoding.Unicode.GetString(Convert.FromBase64String(转换后的字符串));红色标明的是还可以将BigEndianUnicode(UTF-16),UTF-7,UTF-8,ASCII的几种编码转换回来.
     
      

  8.   


                StringBuilder sb = new StringBuilder();
                for (int k = 0; k < 70000; k++)
                {
                    try
                    {
                        byte[] data444 = System.Text.Encoding.GetEncoding(k).GetBytes(str);
                        if (data444[0].ToString() != data444[1].ToString())
                        {
                            sb.Append(k + "@");
                        }
                    }
                    catch
                    {                }
                }data444[0].ToString() != data444[1].ToString())
    一个汉字他转为两个 byte 一般来说他的两个byte是一样的 都是转为 63 就是?? 了
      

  9.   


    试试就知道..
    从 us7ascii读出来的中文,只要是乱码 就是转不出来的....
      

  10.   


    1.两个ORACLE_HOME的tns完全是一样的. 想利用的完全是他们的默认字符集.
    2.这个我可以确定同时查两个库在C#中都是正确的.
    3."对于c#中环境变量的变化方式不熟"主要就是这个问题,
    4.通过程序转换不出来的.
      

  11.   


    建议楼主去看看Encoding.Convert()的用法,我觉得直接用它就可以实现你的需求了。