Oracle管理ODP.NET找不到的tnsnames.ora(Oracle Managed ODP

2019-07-21 03:48发布

我的管理ODP.net webapp的本地工作,但它部署到服务器时,它失败,出现错误:

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

从东张西望,好像这是因为它不能得到tnsnames.ora文件。

我曾尝试没有成功如下:

  • 配售tnsnames.ora文件(同一个本地工作)到甲骨文的家] [产品] ... \网络\ admin文件夹。
  • 设置在托管ODP的web.config部分指向环境变量TNS_ADMIN设置。
  • 设置在托管ODP的web.config部分,直接指向tnsnames.ora文件的TNS_ADMIN设置。

在服务器上,尝试运行用tnsping产量错误TNS-03502:3502信息未找到; 产品=网络,设施= TNS无消息文件

我在想什么?

Answer 1:

尝试使用一个连接字符串 ,它不依赖于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;


Answer 2:

只需添加TNS_ADMIN路径的web.config或app.config中,它指向哪里你有一个tnsnames.ora文件应该工作的文件夹。

<oracle.manageddataaccess.client>
    <version number="*">
      <settings>
        <setting name="tns_admin" value="E:\oracle11\product\11.2.0\client_1\network\admin" />
      </settings>
    </version>
</oracle.manageddataaccess.client>


Answer 3:

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

它发生,我认为它看起来像ODP.net不允许指定TNS文件路径,然后如果你知道文件路径,只需读取文件程序和内容设置为ConnectionStringBuilder的DataSource领域。 不理想,但一个合理的解决方法。



Answer 4:

我是我最后做的TNSNAMES文件中的一些正则表达式同样的事情后。 一旦你已经做了该文件的正则表达式,你应该能够把到这一点在PowerShell中或C#对象

param($tnsnamesPath = 'c:\tns\tnsnames.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("$simplySQLPath\DataReaderToPSObject.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/



文章来源: Oracle Managed ODP.NET can't find tnsnames.ora