Oracle Managed ODP.NET 找不到 tnsnames.ora



我管理的ODP.net web应用程序在本地工作,但当将其部署到服务器时,它失败了,错误:

"TNS:监听器目前不知道连接描述符中请求的服务"

从周围看,这似乎是因为它无法到达tnsname。ora文件。

我尝试了以下操作,但没有成功:

  • 放置名称。Ora文件(与本地工作的相同)放入[oracle home][product]… 网络管理文件夹。
  • 在被管理ODP的web中设置TNS_ADMIN设置。配置部分指向环境变量。
  • 在被管理ODP的web中设置TNS_ADMIN设置。配置部分直接指向tnsnames。ora文件。

在服务器上,尝试运行tnsping产生错误TNS-03502: Message 3502 not found;没有product=NETWORK, facility=TNS的消息文件

我错过了什么?

尝试使用不依赖于tnsnames的连接字符串。Ora,例如:

Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=MyHost)(PORT=MyPort)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=MyOracleSID)));User Id=myUsername;Password=myPassword;

刚刚将tns_admin路径添加到web。Config或app.config,并将其指向有tnsnames的文件夹。Ora文件应该可以工作。

<oracle.manageddataaccess.client>
    <version number="*">
      <settings>
        <setting name="tns_admin" value="E:oracle11product11.2.0client_1networkadmin" />
      </settings>
    </version>
</oracle.manageddataaccess.client>

我在做同样的事情之后,最后在TNSNAMES文件上做了一些正则表达式。一旦你完成了对文件的正则表达式你就可以把它放到Powershell或c#中的对象中了

param($tnsnamesPath = 'c:tnstnsnames.ora',$username = 'user',$password = 'gotmehere', $connectionName = 'mustard', $query = 'Select sysdate from dual')
$simplySQLPath = (Get-Module -ListAvailable simplySQL).ModuleBase
if($simplySQLPath -and (test-path $tnsnamesPath -PathType Leaf) -and (![string]::IsNullOrEmpty($node)))
{
    [System.Reflection.Assembly]::LoadFile("$simplySQLPathDataReaderToPSObject.dll") | OUT-NULL
    Import-Module SimplySql -Force
    $parsedTN = (get-content $tnsnamesPath -raw)  -replace '(.*=.*|n.*=)(.*|n.*)(DESCRIPTION*.=' ,'Data Source = (DESCRIPTION ='  
    $splitTN = $parsedTN -split '(?=.*Data Source = (DESCRIPTION =)' 
    $tnsnames = $splitTN |?{$_ -like "*$connectionName*"}
    $connstring = "$tnsnames;User Id=$username;Password=$password"
    try
    {
        Open-OracleConnection -ConnectionString $connstring -ConnectionName $connectionName
        $result = Invoke-SqlQuery -ConnectionName $connectionName -Query "$SQLQuery"
        Close-SqlConnection -ConnectionName $connectionName
    }
    catch
    {
        $_.exception
    }
}
Else
{
    if(!(test-path $tnsnamesPath -PathType Leaf -ErrorAction Ignore))
    {
        Throw "Check TNSnamesPath:  $tnsNamesPath"
    }
    else
    {
        Throw "Exeception SIMPLYSQL not found in module Path $($env:PSModulePath)"
    }
}
$result

我已经在博客中介绍了这段代码:https://powershellposse.com/2018/03/13/tnsnames-file-parsing/

一个旧的帖子,但我一直在寻找一个类似的解决方案。

我突然想到,因为它看起来像ODP.net不允许指定TNS文件路径,那么如果你知道文件路径,只需以编程方式读取文件并将内容设置为ConnectionStringBuilder的DataSource字段。

相关内容

  • 没有找到相关文章

最新更新