FireDAC (FDQuery) - база данных с точкой в названии
У меня есть эта проблема с компонентом FireDAC -> FDQuery, когда он пытается выбрать данные из базы данных с помощью '.' (точка) в его названии.
Имя базы данных - TEST_2.0, а ошибка при открытии набора данных говорит:
Не удалось найти сервер 'TEST_2' в sys.servers [...]
я пытался {TEST_2.0}
(фигурные скобки) и [TEST_2.0]
(квадратные скобки). Также установка свойства QuotedIdentifiers (Format Opetions) в значение True, похоже, не решает проблему. В запросе SQL я могу добавить "SET QUOTED_IDENTIFIER ON;" но это ломает вставки в набор данных.
Компонент FDConnection может без проблем подключаться к этому серверу и этой базе данных с помощью драйвера MSSQL. Кажется, это набор данных, который не справляется с этим. UniDAC, кажется, справляется со всем без проблем.
Я использую RadStudio 10.2.
Кто-нибудь нашел какое-либо решение для этого? Заранее спасибо за любые ответы
2 ответа
Я получил ответ от Emarcadero, и он работает для меня:
"Проблема не в FireDAC, а в функции SQLPrimaryKeys драйвера ODBC для SQL Server. Он не работает с именем каталога, содержащим точку. FireDAC использует эту функцию для получения полей первичного ключа для набора результатов, когда fiMeta включена в FetchOptions. Элементы. Итак, в качестве обходного пути / решения, пожалуйста, исключите fiMeta из FetchOptions.Items."
Что случилось?
Я смог воспроизвести то, что вы описали здесь. Я закончил на команде метаинформации, в частности вызов функции ODBC SQLPrimaryKeys. Я использовал драйвер SQL Server Native Client 11.0, подключенный к Microsoft SQL Server Express 12.0.2000.8, экземпляр локального сервера базы данных.
Когда я попытался выполнить следующую команду SQL (с созданной базой данных TEST_2.0) через экземпляр компонента TFDQuery с настройками по умолчанию (объект связанного соединения остался с пустым параметром соединения с базой данных) в приложении Delphi Tokyo:
SELECT * FROM [TEST_2.0].INFORMATION_SCHEMA.TABLES
Я получил это исключение, когда функция SQLPrimaryKeys была вызвана с параметром CatalogName, установленным в TEST_2.0 (из метода инструкции выполнения метаинформации):
[FireDAC] [Phys] [ODBC] [Microsoft] [Собственный клиент SQL Server 11.0][SQL Server] Не удалось найти сервер 'TEST_2' в sys.servers. Убедитесь, что указано правильное имя сервера. При необходимости выполните хранимую процедуру sp_addlinkedserver, чтобы добавить сервер в sys.servers.'.
Моей следующей попыткой было естественное изменение значения этого параметра CatalogName на [TEST_2.0] во время отладки, но даже это не удалось по той же причине (просто не удалось для имени [TEST_2), поэтому для меня кажется, что реализация функции ODBC SQLPrimaryKeys с драйвером Я использовал не может правильно обрабатывать точечные значения параметра CatalogName (кажется, игнорировать все после точки).
Что я могу сделать?
Единственное решение, кажется, просто исправление драйверов ODBC. Обходной путь, который я хотел бы предложить, - не использовать точки в именах баз данных (как обсуждено, например, в этой теме). Другим может быть предотвращение получения метаданными объекта набора данных FireDAC (исключая опцию fiMeta из набора опций Items). Это обеспечит вам ответственность за предоставление метаданных объекта набора данных самостоятельно (на данный момент это только определение первичного ключа).