使用 .net 核心查询 Oracle 会抛出连接标识符异常
Query Oracle using .net core throws exception for Connect Identifier
我对 Oracle 很陌生,以前从未使用过它,现在,我正在尝试从安装了 nuget 包 oracle.manageddataaccess.core
的 .Net Core Web 应用程序查询 Oracle 数据库,并使用别名作为数据源,但我收到以下错误:
如果我使用完整的连接字符串,查询将正常工作
ORA-12154: TNS:could not resolve the connect identifier specified
at OracleInternal.Network.AddressResolution..ctor(String TNSAlias, SqlNetOraConfig SNOConfig, Hashtable ObTnsHT, String instanceName, ConnectionOption CO)
at OracleInternal.Network.OracleCommunication.Resolve(String tnsAlias, ConnectionOption& CO)
at OracleInternal.ConnectionPool.PoolManager`3.ResolveTnsAlias(ConnectionString cs, Object OC)
at OracleInternal.ServiceObjects.OracleConnectionImpl.Connect(ConnectionString cs, Boolean bOpenEndUserSession, OracleConnection connRefForCriteria, String instanceName)
因此,从几个链接我可以了解到有一个 tsnnames.ora
文件必须包含连接标识符和连接描述符之间的映射。并且这个文件可以在安装了Oracle的机器上找到,路径为ORACLE_HOME\network\admin
。
问题是:
是否需要在 tsnnames.ora
文件中指定连接字符串中显示为 Data Source: <alias_name>; User ID=<user>; Password=<password>
的别名?我无权访问 Oracle 数据库所在的机器,否则我早就检查过了。
这里是代码片段以获取更多信息:连接字符串和查询值被模拟出来
public static string Read()
{
const string connectionString = "Data Source=TestData;User ID=User1;Password=Pass1";
const string query = "select xyz from myTable";
string result;
using (var connection = new OracleConnection(connectionString))
{
try
{
connection.Open();
var command = new OracleCommand(query) { Connection = connection, CommandType = CommandType.Text };
OracleDataReader reader = command.ExecuteReader();
reader.Read();
result = reader.GetString(0);
}
catch (Exception exception)
{
Console.WriteLine(exception);
throw;
}
}
return result;
}
这里够了吗?还是还需要 added/changed?或者可能问题出在 tsnNames.ora
文件中,该文件可能不包含此处的别名?
提前致谢
对于数据源
Data Source=TestData;User Id=myUsername;Password=myPassword;
您的 tnsnames.ora 可能应该有以下条目
TestData=(DESCRIPTION=
(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=MyHost) (PORT=MyPort)))
(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=MyOracleSID)))
自从
Data Source=TestData;User Id=myUsername;Password=myPassword;
与
相同
Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=MyHost) (PORT=MyPort)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=MyOracleSID)));User Id=myUsername;Password=myPassword;
我对 Oracle 很陌生,以前从未使用过它,现在,我正在尝试从安装了 nuget 包 oracle.manageddataaccess.core
的 .Net Core Web 应用程序查询 Oracle 数据库,并使用别名作为数据源,但我收到以下错误:
如果我使用完整的连接字符串,查询将正常工作
ORA-12154: TNS:could not resolve the connect identifier specified
at OracleInternal.Network.AddressResolution..ctor(String TNSAlias, SqlNetOraConfig SNOConfig, Hashtable ObTnsHT, String instanceName, ConnectionOption CO)
at OracleInternal.Network.OracleCommunication.Resolve(String tnsAlias, ConnectionOption& CO)
at OracleInternal.ConnectionPool.PoolManager`3.ResolveTnsAlias(ConnectionString cs, Object OC)
at OracleInternal.ServiceObjects.OracleConnectionImpl.Connect(ConnectionString cs, Boolean bOpenEndUserSession, OracleConnection connRefForCriteria, String instanceName)
因此,从几个链接我可以了解到有一个 tsnnames.ora
文件必须包含连接标识符和连接描述符之间的映射。并且这个文件可以在安装了Oracle的机器上找到,路径为ORACLE_HOME\network\admin
。
问题是:
是否需要在 tsnnames.ora
文件中指定连接字符串中显示为 Data Source: <alias_name>; User ID=<user>; Password=<password>
的别名?我无权访问 Oracle 数据库所在的机器,否则我早就检查过了。
这里是代码片段以获取更多信息:连接字符串和查询值被模拟出来
public static string Read()
{
const string connectionString = "Data Source=TestData;User ID=User1;Password=Pass1";
const string query = "select xyz from myTable";
string result;
using (var connection = new OracleConnection(connectionString))
{
try
{
connection.Open();
var command = new OracleCommand(query) { Connection = connection, CommandType = CommandType.Text };
OracleDataReader reader = command.ExecuteReader();
reader.Read();
result = reader.GetString(0);
}
catch (Exception exception)
{
Console.WriteLine(exception);
throw;
}
}
return result;
}
这里够了吗?还是还需要 added/changed?或者可能问题出在 tsnNames.ora
文件中,该文件可能不包含此处的别名?
提前致谢
对于数据源
Data Source=TestData;User Id=myUsername;Password=myPassword;
您的 tnsnames.ora 可能应该有以下条目
TestData=(DESCRIPTION=
(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=MyHost) (PORT=MyPort)))
(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=MyOracleSID)))
自从
Data Source=TestData;User Id=myUsername;Password=myPassword;
与
相同Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=MyHost) (PORT=MyPort)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=MyOracleSID)));User Id=myUsername;Password=myPassword;