如何了解 optionsBuilder.UseOracle(@"User Id=<>;Password=<>;Data Source=<>") 中连接字符串的凭据?

How can I learn the credentials for the Connection String in optionsBuilder.UseOracle(@"User Id=<>;Password=<>;Data Source=<>")?

我想从我的代码库(控制台 C# 项目)连接到 Oracle 数据库。
我正在使用 Entity Framework Core 6.0:

    using Microsoft.EntityFrameworkCore;
    Console.WriteLine("Hello, World!");
    BloggingContext oracleContext = new BloggingContext();
    Console.WriteLine(oracleContext.Database.CanConnect());
    public class BloggingContext : DbContext
    {
        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseOracle(@"User Id=userid;Password=password;Data Source=localhost:1521/ORACLE19");
    }

代码编译成功但没有建立连接,
检查 oracleContext.Database.CanConnect() 时,我在下一个输出行中得到 False。 我应该将哪些凭据放入 UseOracle("...") 连接字符串,而不是显示的凭据?我什么都试过了!
我的 Oracle 数据库在我的本地计算机上并且运行良好,因为我可以通过 SQL*plus、RaizorSQL、PL/SQL Developer 等连接工具连接它并查看其内容。
如何使用这些工具或以其他方式学习 UseOracle("...") 的正确连接字符串?这些用户 ID、密码、数据源是什么?

“什么是 SERVICE_NAME?”

你说你可以用sqlplus连接,数据库在你的本地机器上。所以 。 . .

[oracle@vbol83-01 ~]$ sqlplus / as sysdba

SQL*Plus: Release 19.0.0.0.0 - Production on Fri Apr 1 09:04:52 2022
Version 19.3.0.0.0

Copyright (c) 1982, 2019, Oracle.  All rights reserved.


Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0

SQL> show parameter service_name

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
service_names                        string      orcl
SQL>

或者,检查侦听器支持的服务名称:

[

oracle@vbol83-01 ~]$ lsnrctl status

LSNRCTL for Linux: Version 19.0.0.0.0 - Production on 01-APR-2022 09:06:37

Copyright (c) 1991, 2019, Oracle.  All rights reserved.

Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for Linux: Version 19.0.0.0.0 - Production
Start Date                14-MAR-2022 18:08:17
Uptime                    17 days 14 hr. 58 min. 19 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Log File         /u01/app/oracle/diag/tnslsnr/vbol83-01/listener/alert/log.xml
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=vbol83-01.localdomain)(PORT=1521)))
Services Summary...
Service "86b637b62fdf7a65e053f706e80a27ca" has 1 instance(s).
  Instance "orcl", status READY, has 1 handler(s) for this service...
Service "d21995589d8b1045e0556f99782067a1" has 1 instance(s).
  Instance "orcl", status READY, has 1 handler(s) for this service...
Service "orcl" has 1 instance(s).
  Instance "orcl", status READY, has 1 handler(s) for this service...
Service "orclXDB" has 1 instance(s).
  Instance "orcl", status READY, has 1 handler(s) for this service...
Service "pdb01" has 1 instance(s).
  Instance "orcl", status READY, has 1 handler(s) for this service...
The command completed successfully

因此,在 my 系统上,服务名称是 'orcl'。你的可能不一样。

经过两周的试错,我在学习Oracle数据库系统知识的同时,终于连接成功了。正确连接字符串的技巧如下: SERVICE_NAME 的字符串应该是一个可以看作是命令的 sqlplus 答案 显示参数service_name
正如 EdStevens 所指出或在文件 tnsnames.ora 中查找的那样。在我的系统上它是 oracle19.errdonald.net。 但是在这种情况下,User Id 的用户名应该以前缀 C## 开头,因为它应该是 Oracle 系统容器 CDB 中的普通用户。否则,如果用户是本地用户并在可插入数据库 pdb 中创建,假设其名称为 pdb1,则 SERVICE_NAME 的字符串应以 pdb1 前缀开头。 对我来说最关键的是发现用户的密码必须包含不少于两个大写字母才有效! 所以工作代码在我的系统上看起来像这样:

using Microsoft.EntityFrameworkCore;
Console.WriteLine("Hello, World!");
BloggingContext oracleContext = new BloggingContext();
Console.WriteLine(oracleContext.Database.CanConnect());
public class BloggingContext : DbContext
{
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
    optionsBuilder.UseOracle(@"User Id=C##blog;Password=*********SS;Data Source=localhost:1521/oracle19.errdonald.net");
}

或者,连接字符串可能是:

optionsBuilder.UseOracle(@"User Id=blog;Password=*********SS;Data Source=localhost:1521/pdb1.errdonald.net");

如果用户博客在可插入数据库 pdb1 中。
*******SS 表示密码可以是任意的,但包含不少于2个大写字母,例如SS,并且不少于9个字符。