使用 Bequeath 协议通过 ManagedDataAccess 在 C# Windows 应用程序中连接到 Oracle 数据库
Connecting to an Oracle Database in a C# Windows application with ManagedDataAccess using Bequeath Protocol
我正在尝试使用 Visual Studio C# Windows 应用程序,它使用 Bequeath 协议连接到本地 Oracle 12.2 数据库(使用 Oracle.ManagedDataAccess.Client),这样我就不会必须通过 Oracle 侦听器,因为这仅用于本地数据库连接。
我知道 sqlplus 在未指定连接字符串或 TNS 条目时本机使用 Bequeath 协议:
sqlplus scott/tiger
*connected*
SID和service_names都是"mydb":
select instance from v$thread;
-----
mydb
show parameter service_names;
VALUE
-----
mydb
通过SQL Developer连接时我也可以使用Bequeath协议(使用Local/Bequeath的连接类型)。
但是,我一直无法找到在连接字符串中使用 Bequeath 的示例(至少对我而言)。
Oracle Net Services 的 12.1 文档并不是很有帮助。它给出了 Bequeath 的概述,没有任何示例。
tnsnames.ora:
MYDB =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
)
(CONNECT_DATA =
(SID = MYDB)
)
)
MYDB_BEQ =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = BEQ)(PROGRAM = oracle)(ARGV0 = oracleMYDB)
)
)
(CONNECT_DATA = (SID = MYDB)
)
)
以下工作使用 TCP(通过侦听器):
new OracleConnection(@"User Id=scott; Password=tiger
;Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(
HOST=localhost)(PORT=1521)))(CONNECT_DATA=(SERVER=DEDICATED)
(SERVICE_NAME=MYDB)))");
*connected*
或使用 TNSNAMES 条目:
new OracleConnection("User Id=scott;Password=tiger;Data Source=MYDB")
*connected*
我可以使用上面的 BEQ 条目通过 TNSNAMES 连接 SQLPLUS:
sqlplus scott/tiger@mydb_beq
*connected*
但是,我似乎无法通过 Oracle.ManagedDataAccess:
来解决这个问题
new OracleConnection(@"User Id=scott; Password=tiger
;Data Source = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = BEQ)(PROGRAM = oracle)(ARGV0 = oracleMYDB)))(CONNECT_DATA = (SID = MYDB)))")
ORA-12533: Network Session: Connect transport address syntax error
还尝试使用上面有效的 TNSNAMES 条目:
new OracleConnection("User Id=scott;Password=tiger;Data Source=MYDB_BEQ")
ORA-12533: Network Session: Connect transport address syntax error
我可能遗漏了一些基本的东西,但我不确定还能尝试什么...
看来这不可能。
在 12c Data Provider for .NET Developer's Guide 的数据源部分:
No bequeath (beq) support. Default address is instead TCP loopback
with port 1521 and Oracle service name from environment (ORACLE_SID)
我正在尝试使用 Visual Studio C# Windows 应用程序,它使用 Bequeath 协议连接到本地 Oracle 12.2 数据库(使用 Oracle.ManagedDataAccess.Client),这样我就不会必须通过 Oracle 侦听器,因为这仅用于本地数据库连接。
我知道 sqlplus 在未指定连接字符串或 TNS 条目时本机使用 Bequeath 协议:
sqlplus scott/tiger
*connected*
SID和service_names都是"mydb":
select instance from v$thread;
-----
mydb
show parameter service_names;
VALUE
-----
mydb
通过SQL Developer连接时我也可以使用Bequeath协议(使用Local/Bequeath的连接类型)。
但是,我一直无法找到在连接字符串中使用 Bequeath 的示例(至少对我而言)。
Oracle Net Services 的 12.1 文档并不是很有帮助。它给出了 Bequeath 的概述,没有任何示例。
tnsnames.ora:
MYDB =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
)
(CONNECT_DATA =
(SID = MYDB)
)
)
MYDB_BEQ =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = BEQ)(PROGRAM = oracle)(ARGV0 = oracleMYDB)
)
)
(CONNECT_DATA = (SID = MYDB)
)
)
以下工作使用 TCP(通过侦听器):
new OracleConnection(@"User Id=scott; Password=tiger
;Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(
HOST=localhost)(PORT=1521)))(CONNECT_DATA=(SERVER=DEDICATED)
(SERVICE_NAME=MYDB)))");
*connected*
或使用 TNSNAMES 条目:
new OracleConnection("User Id=scott;Password=tiger;Data Source=MYDB")
*connected*
我可以使用上面的 BEQ 条目通过 TNSNAMES 连接 SQLPLUS:
sqlplus scott/tiger@mydb_beq
*connected*
但是,我似乎无法通过 Oracle.ManagedDataAccess:
来解决这个问题new OracleConnection(@"User Id=scott; Password=tiger
;Data Source = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = BEQ)(PROGRAM = oracle)(ARGV0 = oracleMYDB)))(CONNECT_DATA = (SID = MYDB)))")
ORA-12533: Network Session: Connect transport address syntax error
还尝试使用上面有效的 TNSNAMES 条目:
new OracleConnection("User Id=scott;Password=tiger;Data Source=MYDB_BEQ")
ORA-12533: Network Session: Connect transport address syntax error
我可能遗漏了一些基本的东西,但我不确定还能尝试什么...
看来这不可能。
在 12c Data Provider for .NET Developer's Guide 的数据源部分:
No bequeath (beq) support. Default address is instead TCP loopback with port 1521 and Oracle service name from environment (ORACLE_SID)