Jef*_*eff 39 c# oracle tnsnames
我正在开发一个非常简单的应用程序,我打算用它来解决我在几台机器上遇到的问题,但在我做到这一点之前,我遇到了一些问题,包括cpu架构差异和Oracle数据库库.
我有一个数据库服务器tnsnames.ora
,坐在我的C:\oracle\11g\network\admin
目录中.如果我收拾这台服务器,我会得到所需的响应.如果我使用Oracle.DataAccess.Client将我的C#程序编码为使用以下代码连接到此服务器,则它可以正常工作.
string connectionString = "Data Source=DSDSDS;User Id=UNUNUN;Password=PWPWPW;";
DataTable dataTable = new DataTable();
using (var connection = new OracleConnection(connectionString)) {
connection.Open();
using (var command = new OracleCommand()) {
command.Connection = connection;
command.CommandText = sql;
command.CommandType = CommandType.Text;
using (var oda = new OracleDataAdapter(command)) {
oda.Fill(dataTable);
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是,Oracle.DataAccess依赖于它运行的系统的体系结构.我看到有另一个库Oracle.ManagedDataAccess,它独立于架构.当我使用这个库时,它不再能够连接到服务器.一个ORA-12545: Network Transport: Unable to resolve connect hostname
被抛出.
为什么会这样?这两个库之间有什么不同,因为基于我到目前为止所读到的内容,这应该不是问题.
额外的信息:
C:\oracle\11g\BIN
定义了.tnsnames.ora
文件如果我将tnsnames.ora移动到与我的.exe文件相同的位置,它就可以了.为什么Oracle.DataAccess可以在C:\oracle\11g\network\admin
目录中找到tnsnames.ora 但Oracle.ManagedAccess不能?
met*_*art 60
在ODP.NET,托管驱动程序中解析TNS名称的优先顺序是这样的(见这里):
我相信您的示例使用Oracle.DataAccess而不是Oracle.ManagedDataAccess的原因是后者不支持基于Windows注册表的配置(请参阅文档) - ODP.NET安装设置ORACLE_HOME注册表项(HLKM\SOFTWARE\Oracle)\Key_NAME\ORACLE_HOME)仅由非托管部件识别.
kol*_*sov 13
尝试将tnsnames.ora的路径添加到配置文件中:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<oracle.manageddataaccess.client>
<version number="4.112.3.60">
<settings>
<setting name="TNS_ADMIN" value="C:\oracle\product\10.2.0\client_1\NETWORK\ADMIN\" />
</settings>
</version>
</oracle.manageddataaccess.client>
</configuration>
Run Code Online (Sandbox Code Playgroud)
为了避免所有Oracle不知道它在哪里寻找TNSNAMES.ORA的麻烦(我对多个Oracle版本和32/64位有更多的困惑),可以将设置从现有的TNSNAMES.ORA复制到自己的配置中文件并将其用于您的连接。
假设您对TNSNAMES.ORA中的“ DSDSDS”引用感到满意,该引用映射为以下内容:
DSDSDS = {DESCRIPTION = {ADDRESS_LIST = {ADDRESS = {PROTOCOL = TCP} {Host = DSDSDSHost} {Port = 4521}}} {CONNECT_DATA = {SERVICE_NAME = DSDSDSService}}})
string connectionString = "Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(Host=DSDSDSHost)(Port=4521)))(CONNECT_DATA=(SERVICE_NAME=DSDSDSService)));User Id=UNUNUN;Password=PWPWPW;";