SSRS 2022搭配ODPM 19.21查询USERENV('LANG')结果随机切换问题
问题场景
- 正在做SSRS 2022升级前的兼容性验证,用Oracle ODP.Net Managed Driver(ODPM)19.21版本连接Oracle E-Business Suite 11i(Oracle 11.2.0.4)数据库
- 原ODP.Net版本依赖Windows注册表的NLS_LANG设置,但ODPM不支持这个配置
- 测试发现执行
SELECT userenv('LANG') FROM dual时,结果在ZHT和US之间随机切换;把分页报表的“Language Property”设为en-US也没用,SSRS没把报表语言传递给ODPM,需要让这个SQL始终返回US
可行解决办法
1. 连接字符串里指定NLS参数
直接在数据库连接字符串中添加NLS_LANGUAGE=AMERICAN参数,强制会话语言为英文。示例:
Data Source=你的EBS数据库实例;User Id=账号;Password=密码;NLS_LANGUAGE=AMERICAN;NLS_TERRITORY=AMERICA
ODPM会优先读取连接字符串里的NLS配置,覆盖系统默认值,保证会话语言稳定为US。
2. 数据集SQL里先设置会话参数
在查询userenv('LANG')前,先执行ALTER SESSION语句强制设置语言,把两个语句合并到数据集SQL中:
ALTER SESSION SET NLS_LANGUAGE='AMERICAN'; SELECT userenv('LANG') FROM dual;
注意要确保SSRS数据集允许执行多语句SQL,这样查询前会话语言就被固定下来了。
3. 配置ODPM全局设置(全报表生效)
找到ODPM的配置文件Oracle.ManagedDataAccess.dll.config,在<oracle.manageddataaccess.client>节点下添加全局NLS配置:
<settings> <setting name="NLS_LANGUAGE" value="AMERICAN"/> <setting name="NLS_TERRITORY" value="AMERICA"/> </settings>
这个配置会作用于所有使用ODPM的SSRS连接,不用逐个改报表或连接字符串,统一会话语言为英文。
验证方式
设置完成后重新运行报表,执行SELECT userenv('LANG') FROM dual确认结果始终为US,同时检查其他依赖语言的报表内容是否正常显示。
内容的提问来源于stack exchange,提问作者Wilson Shen
相关产品推荐
相关产品推荐

