8

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

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

环顾四周,似乎这是因为它无法访问 tnsnames.ora 文件。

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

  • 将 tnsnames.ora 文件(与本地工作相同的文件)放入 [oracle home][product]...\network\admin 文件夹。
  • 在托管 ODP 的 web.config 部分中设置指向环境变量的 TNS_ADMIN 设置。
  • 在托管 ODP 的 web.config 部分中设置 TNS_ADMIN 设置,直接指向 tnsnames.ora 文件。

在服务器上,尝试运行 tnsping 会产生错误 TNS-03502:找不到消息 3502;没有产品=NETWORK、设施=TNS 的消息文件

我错过了什么?

4

4 回答 4

14

尝试使用不依赖于 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;
于 2013-04-08T19:46:10.763 回答
8

只需将 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>
于 2015-07-09T15:34:35.360 回答
1

我追求的是同样的事情,我最终在 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/

于 2018-03-13T22:45:21.100 回答
0

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

我突然想到,看起来 ODP.net 不允许指定 TNS 文件路径,那么如果您知道文件路径,只需以编程方式读取文件并将内容设置为 ConnectionStringBuilder 的 DataSource 字段。不理想,但一个合理的解决方法。

于 2015-10-12T08:41:58.240 回答