在连接字符串中包含服务名称的语法是啥?

Posted

技术标签:

【中文标题】在连接字符串中包含服务名称的语法是啥?【英文标题】:What Is the Syntax for Including the Service Name in a Connection String?在连接字符串中包含服务名称的语法是什么? 【发布时间】:2021-02-13 01:59:44 【问题描述】:

我有一个 C# ASP.Net MVC Web 应用程序。我正在尝试成功连接到 Oracle 数据库。 我收到“ORA-12514:TNS:监听器当前不知道连接描述符中请求的服务”错误。 我无权访问数据库所在的服务器。但我确实可以访问已安装在我的机器上的 Oracle SQL Developer。

在我的 C# 代码中,我正在设置这样的连接字符串:

ConnectionString = "DataSource=XXX.XX.XXX.XXX/abcd,1521;User ID=userid;Password=password;";

abcd 应该是服务名称。 1521是端口号。

我了解我的连接字符串可能不是错误的原因,但我想排除它。另外,我知道更正确的处理方式可能是在 web.config 中设置连接字符串并根据需要检索它,但我这样做只是为了便于测试,直到我知道我能够连接到数据库成功。

让我感到奇怪的是,我能够使用 Oracle SQL Developer 连接到数据库,并使用我在连接字符串中使用的相同 IP 地址、端口号、服务名称、用户名和密码。

首先,我想知道我的连接字符串是否有效。如果您对问题可能有其他想法,我们也将不胜感激。

在 Oracle SQL Developer 中使用此命令: select sys_context('userenv','service_name') from dual;

我能够确定我在连接字符串中使用的服务名称是存在的,尽管我猜这并不能保证服务已启动。 无论如何,我都不是 DBA。事实上,总的来说,我对 .Net 和 Web 开发还是新手,但我已被指派解决这个问题。任何帮助表示赞赏。

【问题讨论】:

给你一个提示:在你的桌面上新建一个文本文件并重命名为a.udl,双击它会看到一个熟悉的数据连接对话框,将提供者更改为oracle,设置所有设置,测试它,保存它,然后将它命名回a.txt并在记事本中打开它;这是你的连接字符串 @CaiusJard 非常感谢您的提示。但是,我在提供程序列表中没有 Oracle。它默认选择打开 .udl 文件的应用程序是 OLE DB 核心服务。我应该使用什么应用程序来打开网址?我尝试从我的下载中选择 sqldeveloper.exe,但这只会启动 Oracle SQL Devleloper。 呃.. 可能是驱动程序问题 - OLE DB COre Services 是正确的应用程序。试试这个类似的技巧:向您的项目添加一个新的 DataSet,打开它,右键单击表面上的任意位置并添加一个表适配器。创建一个新的连接字符串,填写 Oracle 对话框,测试,保存.. 完成向导后,连接字符串将最终隐藏在您的应用程序设置中(只需触发 select * from dual 之类的查询。我会很感兴趣知道这是否在其他提示没有显示时显示您的 oracle 驱动程序 【参考方案1】:

我不记得看到以下格式

DataSource=XXX.XX.XXX.XXX/abcd,1521

作为有效(这并不意味着它不是,我只是没有看到它)。

我见过的比较常见的有:

DataSource=XXX

其中 XXX 是对您的 tnsnames.ora 文件的引用

DataSource=//nnn.nnn.nnn.nnn/service_name
DataSource=//nnn.nnn.nnn.nnn:port/service_name

所以不妨试试这些变体,看看效果如何。 https://www.c-sharpcorner.com/UploadFile/nipuntomar/connection-strings-for-oracle/

上还有更明确​​的替代方案列表

【讨论】:

【参考方案2】:

我最终想通了。我认为我的连接字符串格式不正确。我把它改成了:

ConnectionString = "DataSource=XXX.XX.XXX.XXX/abcd;User ID=userid;Password=password;";

基本上,我只是把端口号取下来了。就我而言,默认端口是我无论如何都需要的。如果我需要指定端口号,我不确定我会做什么。

【讨论】:

以上是关于在连接字符串中包含服务名称的语法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

在异常日志记录中包含“应用程序名称”

Swift - 有没有办法在连接字符串中包含单引号(')?

使用golang sql连接mysql时,如果我的用户名中包含@符号怎么办?

获得单行和2列结果:第一列中包含count(*),第二列中包含连接字符串

db2 基础语法

带有实例名称和域的 JDBC 连接字符串