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) - 名称中带有点的数据库的主要内容,如果未能解决你的问题,请参考以下文章