C#连接数据库失败
1.原先使用的是oracle11,后来升级数据库到oracle19c,启动程序,数据库连接时报错"ORA-28040: No matching authentication protocol"
2.原因分析:最近服务器数据库版本升级到了19c,网上查了主要是说orcale的客户端版本和访问的oracle服务端的版本不一致,那就可能是因为所用的驱动程序与服务器的版本不兼容。找到如下解决方案:
解决方案:官方解释是:
This issue is caused by the default setting for allowed logon version in the 12 database.
Note that the SQLNET.ALLOWED_LOGON_VERSION parameter has been deprecated in 12c.
That parameter has been replaced by these:
SQLNET.ALLOWED_LOGON_VERSION_SERVER=n
SQLNET.ALLOWED_LOGON_VERSION_CLIENT=n
The default setting for the new parameters is 11. Any client that attempts to connect must
be at version 11 or higher unless these parameters are explicitly set in the server side sqlnet.ora file.
这段话的意思是,(SQLNET.ALLOWED_LOGON_VERSION)参数在12c中已经被弃用了,被另外两个参数所取代(SQLNET.ALLOWED_LOGON_SERVER,SQLNET.ALLOWED_LOGON_CLIENT)。该参数用来限制可以连接到数据库服务器上的最小客户端版本,12c中这两个新参数的默认值为11,即11g及以上客户端版本可以连接到数据库服务器上。
两个参数区别如下:
SQLNET.ALLOWED_LOGON_VERSION_SERVER:控制可以连接到12c数据库的客户端版本(client --->orace 12c db)
SQLNET.ALLOWED_LOGON_VERSION_CLIENT:控制12c数据库可以连到哪些版本的数据库(orace 12c db --->其它版本的oracle db),例如:控制通过DB LINK可连接到哪些版本的oracle库。
具体解决办法:
在Oracle用户下,将%ORACLE_HOME%/network/admin/sqlnet.ora文件(如果没有sqlnet.ora文件,那么就创建一个)最后添加如下的行:
SQLNET.ALLOWED_LOGON_VERSION_SERVER=8
SQLNET.ALLOWED_LOGON_VERSION_CLIENT=8
3.于是按以上方法进行操作
重启应用
C:\Users\Administrator>net stop oracleServiceOrcl
OracleServiceORCL 服务正在停止.....................................
OracleServiceORCL 服务已成功停止。
C:\Users\Administrator>net start oracleServiceOrcl
OracleServiceORCL 服务正在启动 ........................
OracleServiceORCL 服务已经启动成功。
4.连接时报另一个错"ORA-1017: invalid username/password; logon denied",看着应该是账号密码错误,确认了一下,账号密码没有错,为啥还会报错呢?
查看报错信息:在 Oracle.DataAccess.Client.OracleException.HandleErrorHelper(Int32 errCode, OracleConnection conn, IntPtr opsErrCtx, OpoSqlValCtx* pOpoSqlValCtx, Object src, String procedure, Boolean bCheck),难道是驱动程序是32位,服务器数据库版本是64位,不匹配。换了几个64位的Oracle.DataAccess.dll,还是报同样错。
5.既然是账号密码错误,那修改数据库密码试试,原密码为:XXXXXX!,新密码把叹号去掉
SQL> alter user cosem identified by XXXXXX;
用户已更改。
启动程序,居然不报错了。
再把密码改回原来的XXXXXX!,居然也不报错了。
问题算是解决的,但这到底为啥啊?百思不得其解。