FireDAC (FDQuery) - 名称中带有点的数据库

Posted

技术标签:

【中文标题】FireDAC (FDQuery) - 名称中带有点的数据库【英文标题】:FireDAC (FDQuery) - database with dot in it's name 【发布时间】:2018-04-10 16:05:59 【问题描述】:

当 FireDAC -> FDQuery 组件尝试使用“.”从数据库中选择数据时,我遇到了这个问题(点)在它的名字中。

数据库名称是 TEST_2.0,打开数据集的错误是:

在 sys.servers [...] 中找不到服务器“TEST_2”[...]

我试过TEST_2.0(大括号)和[TEST_2.0](方括号)。将 QuotedIdentifiers (Format Opetions) 属性设置为 True 似乎也不能解决问题。在 SQL 查询中,我可以添加 'SET QUOTED_IDENTIFIER ON;'但这会中断对数据集的插入。

FDConnection 组件可以使用 MSSQL 驱动程序毫无问题地连接到该服务器和该数据库。似乎是数据集没有处理它。 UniDAC 似乎可以毫无问题地处理所有事情。

我正在使用 RadStudio 10.2。

有没有人找到解决这个问题的方法?提前感谢您的任何回复

【问题讨论】:

能分享一下你执行的SQL命令吗?我能够使用命令SELECT * FROM [TEST_2.0].INFORMATION_SCHEMA.TABLES 重现此问题,源是元数据命令,特别是SQLPrimaryKeys ODBC 函数。在确定答案之前,我想知道您的具体情况。 @Victoria - 我尝试了多个 SQL。数据集 SQL 字符串中的基数是 SELECT * FROM CRM_USERS (CRM_USERS 是表名)。后来我尝试了SELECT * FROM [TEST_2.0].[dbo].[CRM_USERS]。但唯一真正有帮助的是SET QUOTED_IDENTIFIER ON; SELECT * FROM CRM_USERS,它破坏了数据集的插入/追加方法 @Victoria FDQuery 数据集通过参数连接到 FDConnection 组件:Server: (localhost);数据库:Test_2.0 【参考方案1】:

我收到了 Emarcadero 的回复,它对我有用:

"问题不在 FireDAC 中,而在 SQL Server ODBC 驱动程序中 SQLPrimaryKeys 函数。它无法使用目录名称 包含一个点。 FireDAC 使用此函数获取主键字段 对于结果集,当 fiMeta 包含在 FetchOptions.Items 中时。所以, 作为一种解决方法/解决方案,请排除 fiMeta FetchOptions.Items。”

【讨论】:

够有趣的。我得出了相同的结论(在不同的情况下)。我现在发布的答案是昨天准备好的 :) 当然,解决方法可能还不够,但我们唯一能做的就是向 Microsoft 报告。【参考方案2】:

怎么了?

我能够重现您在此处描述的内容。我结束了元信息命令,特别是SQLPrimaryKeys ODBC 函数调用。我使用 SQL Server Native Client 11.0 驱动程序连接到本地数据库服务器实例 Microsoft SQL Server Express 12.0.2000.8。

当我尝试通过具有默认设置的TFDQuery 组件实例执行以下 SQL 命令(创建了 TEST_2.0 数据库)时(链接的连接对象留下了空的数据库连接参数)德尔福东京应用:

SELECT * FROM [TEST_2.0].INFORMATION_SCHEMA.TABLES

当调用SQLPrimaryKeys 函数并将CatalogName 参数设置为TEST_2.0 时引发此异常(来自元信息语句方法Execute) :

[FireDAC][Phys][ODBC][Microsoft][SQL Server Native Client 11.0][SQL 服务器]在 sys.servers 中找不到服务器“TEST_2”。验证 指定了正确的服务器名称。如有必要,执行存储的 过程 sp_addlinkedserver 将服务器添加到 sys.servers。'。

我的下一次尝试自然是在调试时将 CatalogName 参数值修改为 [TEST_2.0],但即使这样也以类似的原因失败(只是名称 [TEST_2.0] strong>[TEST_2),所以对我来说,我使用的驱动程序的SQLPrimaryKeys ODBC 函数实现似乎无法正确处理带点的 CatalogName 参数值(它似乎忽略了所有内容点之后)。

我能做什么?

唯一的解决方案似乎只是修复 ODBC 驱动程序。我建议的解决方法是在数据库名称中使用点(如在 this thread 中讨论的那样)。另一个可能是阻止 FireDAC 获取数据集对象元数据(通过从 Items 选项集中排除 fiMeta 选项)。这将为您带来自己提供数据集对象元数据的责任(此时只有主键定义)。

【讨论】:

以上是关于FireDAC (FDQuery) - 名称中带有点的数据库的主要内容,如果未能解决你的问题,请参考以下文章

firedac数据集的序列和还原

如何将字符串插入 sQlite.sdb (FireDac)?

msgpack配合FIREDAC传输多表数据

FireDAC 下的批量 SQL 命令执行

FireDAC 下的批量 SQL 命令执行

调用DATASNAP+FIREDAC的远程方法有时会执行二次SQL或存储过程的BUG