Oracle ManagedDataAccess和登录时的特殊字符



我在Oracle.ManagedDataAccess中遇到了一个问题,即似乎不可能使用非ASCII连接字符串(非ASCII只是一个经验猜测)。

这一切都很好:

var cs = string.Format("Data Source={2};Password={1};User ID={0}", "user", "pwd", "mydb");
var connection = new OracleConnection(cs);
connection.Open();

但这不起作用(å、ä和ö是瑞典字母):

var cs = string.Format("Data Source={2};Password={1};User ID={0}", "åäö", "lösenord", "mydb");
var connection = new OracleConnection(cs);
connection.Open();

并投掷

Oracle.ManagedDataAccess.Client.OracleException: ORA-01017: invalid username/password; logon denied

两个用户都可以通过sqldeveloper登录。

有人知道解决这个问题的方法吗?或者这是Oracle的ManagedDataAccess(好吧,DataAccess)库的已知限制吗?

忍者的东西,比如使用Chr(int),在登录时很难做到。

DB信息:

NLS_LANGUAGE    AMERICAN
NLS_TERRITORY   AMERICA
NLS_CURRENCY    $
NLS_ISO_CURRENCY    AMERICA
NLS_NUMERIC_CHARACTERS  .,
NLS_CHARACTERSET    WE8MSWIN1252
NLS_CALENDAR    GREGORIAN
NLS_DATE_FORMAT DD-MON-RR
NLS_DATE_LANGUAGE   AMERICAN
NLS_SORT    BINARY
NLS_TIME_FORMAT HH.MI.SSXFF AM
NLS_TIMESTAMP_FORMAT    DD-MON-RR HH.MI.SSXFF AM
NLS_TIME_TZ_FORMAT  HH.MI.SSXFF AM TZR
NLS_TIMESTAMP_TZ_FORMAT DD-MON-RR HH.MI.SSXFF AM TZR
NLS_DUAL_CURRENCY   $
NLS_COMP    BINARY
NLS_LENGTH_SEMANTICS    BYTE
NLS_NCHAR_CONV_EXCP FALSE
NLS_NCHAR_CHARACTERSET  AL16UTF16
NLS_RDBMS_VERSION   11.2.0.1.0

编辑:

还测试了这一点(即添加引号,就像OracleConnectionStringbuilder对"="所做的那样):

var cs = string.Format("Data Source={2};Password={1};User ID={0}", ""åäö"", ""lösenord"", "mydb");
var connection = new OracleConnection(cs);
connection.Open();

我刚刚遇到了同样的问题,从2016年9月16日(4.121.2.20150926)起,最新的ODP托管驱动程序版本解决了这个问题。

请小心从Oracle网站的32位部分下载(http://www.oracle.com/technetwork/database/windows/downloads/utilsoft-087491.html)因为Oracle似乎错过了将其添加到64位部分的机会,该部分的最新版本仍从2015年10月开始。有关更多信息,请参阅我在Oracle论坛上提出的问题:https://community.oracle.com/message/14037653#14037653

这让你有点想知道Oracle在做什么,因为他们在托管驱动程序中已经有3年不支持特定语言的字符了。。。

我的用户名中有特殊字符(例如"=")的问题。我使用OracleConnectionStringBuilder解决了这个问题。它一定有某种编码。试试这个,我希望它对你的问题也有帮助。

OracleConnectionStringBuilder connBuilder = new OracleConnectionStringBuilder();
connBuilder.DataSource = "mydb";
connBuilder.UserID = "åäö";
connBuilder.Password = "lösenord";
var connection = new OracleConnection(connBuilder.ToString());
connection.Open();

最新更新