惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - 司徒正美
大猫的无限游戏
大猫的无限游戏
Scott Helme
Scott Helme
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
S
Secure Thoughts
Google DeepMind News
Google DeepMind News
博客园_首页
Hacker News: Ask HN
Hacker News: Ask HN
量子位
Jina AI
Jina AI
I
InfoQ
V
V2EX
Martin Fowler
Martin Fowler
Y
Y Combinator Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
人人都是产品经理
人人都是产品经理
B
Blog
IT之家
IT之家
云风的 BLOG
云风的 BLOG
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
博客园 - Franky
博客园 - 【当耐特】
N
Netflix TechBlog - Medium
Cloudbric
Cloudbric
H
Heimdal Security Blog
TaoSecurity Blog
TaoSecurity Blog
S
Security @ Cisco Blogs
U
Unit 42
Project Zero
Project Zero
Webroot Blog
Webroot Blog
The Register - Security
The Register - Security
N
News | PayPal Newsroom
Microsoft Security Blog
Microsoft Security Blog
H
Help Net Security
Forbes - Security
Forbes - Security
宝玉的分享
宝玉的分享
Last Week in AI
Last Week in AI
C
Check Point Blog
博客园 - 聂微东
M
MIT News - Artificial intelligence
有赞技术团队
有赞技术团队
D
DataBreaches.Net
Cyberwarzone
Cyberwarzone
N
News and Events Feed by Topic
N
News and Events Feed by Topic
Simon Willison's Weblog
Simon Willison's Weblog
J
Java Code Geeks
G
Google Developers Blog
GbyAI
GbyAI
T
Threatpost

博客园 - 宽田

SQLite在.NET中自适应32位/64位系统 OWIN是什么? 好的用户界面-界面设计的一些技巧 Android模拟器连接本李服务器localhost win7 64位 VS2010调试提示“ORA-12154: TNS: 无法解析指定的连接标识符”的解决方法 Js 验证中文字符长度 Javascript技巧 解释器模式(interpreter): 访问者模式(Visitor) 职责链模式(Chain of Responsibility) Web Service 中返回DataSet结果大小改进 通用数据链接(UDL)的用法 ORACLE WITH AS 用法 Oracle REGEXP_INSTR 用法 C# 实现自定义事件 错误:200, Stream not found, NetStream.Play.StreamNotFound, clip: '[Clip] GetCallbackEventReference(客户端调用服务器端)的用法 wcf Svcutil用法 IIS 增加net.tcp绑定
客户端字符集NLS_LANG
宽田 · 2012-05-11 · via 博客园 - 宽田

程序在调用Oracle的Package中时Fnd_Request.SUBMIT_REQUEST执行结果始终为零。  Package部分代码如下。

declare  x_request_id NUMBER;
begin
    fnd_global.apps_initialize(11,11,11); 
    select Fnd_Global.user_id into x_request_id from dual;
    dbms_output.put_line(x_request_id);
     x_request_id :=
           Fnd_Request.SUBMIT_REQUEST(   
           'xx'--1
           'xx',--2
            '',--3
            '',--4
            FALSE,--5
            'xx',--6
            'xxx',--7
            '',--8
            '',--9
            'xxxx',--10
            'xxx',--11
            chr(0),'','','',--15
            '','','','','','','','','','','','','','','','','','','','',--35
            '','','','','','','','','','','','','','','','','','','','',--55
            '','','','','','','','','','','','','','','','','','','','',--75
            '','','','','','','','','','','','','','','','','','','','',--95
            '','','','','','','','','','');--105
      dbms_output.put_line(x_request_id);
end;

 经了解应该是NLS_LANG问题。网上找到的在程序设置方法均不行。

  

//方法1:不行
  
//     using System.Runtime.InteropServices;
  
//      [DllImport("msvcrt.dll")]
  
//      private static extern int _putenv(string str);
  
//_putenv("AMERICAN_AMRICA.UTF8");//方法2,不行
            Environment.SetEnvironmentVariable("NLS_LANG""AMERICAN_AMERICA.UTF8");
         using (OracleConnection conn = new OracleConnection(connString))
            {
                conn.Open();
                using (OracleTransaction trans = conn.BeginTransaction())
                {
                     ……
                }
             }

最终查询注册表中的NLS_LANG键,将其修改为:AMERICAN_AMERICA.UTF8解决。

主要问题是: oracle客户端软件的字符编码与服务器端的字符编码不一致造成的。

oracle服务端字符编码为: ZHS16GBK

oracle客户端字符编码为:  WE8ISO8859P1

解决办法有三种: 

(1)修改客户端注册表: 找到Oracle安装注册项下的NLS_LANG,将其值改为"SIMPLIFIED CHINESE_CHINA.ZHS16GBK

(2)通过调用_putenv函数,在程序中用代码设置:

using System.Runtime.InteropServices;
...
[DllImport("msvcrt.dll")]
private static extern int _putenv(string str);
...
_putenv("NLS_LANG = SIMPLIFIED CHINESE_CHINA.ZHS16GBK");

//数据库操作
_putenv("NLS_LANG = AMERICAN_AMRICA.WE8ISO8859P1");

(3)通过C#自带的函数设置环境变量

System.Environment.SetEnvironmentVarible("NLS_LANG "," SIMPLIFIED CHINESE_CHINA.ZHS16GBK");

//数据库操作
System.Environment.SetEnvironmentVarible("NLS_LANG ","AMERICAN_AMRICA.WE8ISO8859P1");

需要注意的是: 第二、三种利用函数进行设置环境变量的操作必须在数据库操作的外边才能生效。

参考文章2:修改客户端字符集NLS_LANG(http://www.cnblogs.com/hondahsu/archive/2012/03/20/2407911.html)

      在访问Oracle的客户端安装Oracle Client过程中并没有选项选择Oracle Client的字符集,安装完毕后在注册表HKLOCAL_MACHINE\SOFTWARE\ORACLE\KEY_ORACLECLENT_HOME1\可以找到NLS_LANG键,值为当前OS的字符集。如简体系统为:ZHS16GBK,繁体系统为:MSWIN950。可见,Oracle Client(以下简称NLS_LANG)在安装过程中选择了OS的字符集作为默认的NLS_LANG字符集。

设定NLS_LANG有三种方法:

     a) 修改注册表:将HKLOCAL_MACHINE\SOFTWARE\ORACLE\KEY_ORACLECLENT_HOME1\下NLS_LANG键值改为你要设定的字符集,如将SIMPLIFIED CHINESE_CHINA.ZHS16GBK改为:SIMPLIFIED CHINESE_CHINA.AL32UTF8。这种做法如果无效,即使重新启动机器后,也没有生效,NLS_LANG仍使用当初安装时的OS字符集,就试用第个方法。

     b) 设定环境变量:在My Computer->Properties->Advanced->Environment Variables->System Variables 新增环境变量设置,如:Variable name=NLS_LANG,Variable Value= SIMPLIFIED CHINESE_CHINA.AL32UTF8。这样NLS_LANG字符集为UTF8,这个NLS_LANG优先序高于注册表中的NLS。注意:环境变量设在系统变量中(System Vairables),而不是用户变量(User Vairables)。

    c) 在应用程序运行的Process Session中设定:在程序运行之前,先通过set NLS_LANG=进程Session的字符集。例如:

Echo %nls_lang%,在这个session中,已经设定NLS_LANG字符集为ZHS16GBK。同样,你也可以新开一个CMD窗口,设定另一种NLS_LANG字符集。这种在session中设定NLS_LANG的优先序高于系统环境变量NLS_LANG。注册表NLS_LANG、系统环境变量NLS_LANG、Session NLS_LANG的优先序是:Session NLS_LANG > 系统环境变量NLS_LANG > 注册表NLS_LANG。