Ошибка FireDac 314 - но библиотеки DLL находятся в каталоге программы

При попытке доступа к базе данных MySql я получаю:

[FireDac] [Phys] [MySQL] -314. Не удается загрузить библиотеку поставщика [libmysql.dll или libmysqlld.dll]

Раньше этого не происходило с этим (неизменным) кодом, однако я обновился до Windows 10 и переустановил Delphi XE8, так что, очевидно, это вопрос конфигурации системы.

Чтобы попытаться решить проблему, я скопировал оба этих файла в c: \ windows \ sysytem32.

Когда это не помогло, я скопировал их в \ win32 \ debug, где находится сгенерированный .EXE.

Я представляю, что делаю что-то довольно глупое, но не понимаю, что.


person Mawg says reinstate Monica    schedule 19.08.2015    source источник
comment
Пожалуйста, прекратите копировать файлы в system32. И FWIW, это 64-битный системный каталог, поэтому ваш 32-битный процесс его не видит. И, пожалуйста, также не копируйте их в syswow64, 32-битный системный каталог, потому что это тоже не ваше право изменять.   -  person David Heffernan    schedule 19.08.2015
comment
@ Кен, спасибо, это помогло. Не могли бы вы опубликовать его в качестве ответа, чтобы я мог принять его и прояснить ситуацию для всех, кто прочитает этот вопрос в будущем?   -  person Mawg says reinstate Monica    schedule 19.08.2015
comment
Не стесняйтесь написать свой ответ. Если этот ответ предполагает использование системного каталога, я с радостью проголосую против!   -  person David Heffernan    schedule 19.08.2015
comment
@David, на протяжении всего своего сообщения вы были яростно антисистемным каталогом. Не могли бы вы объяснить мне, почему? Копирование в каталог приложений является обременительным, если вы кодируете много приложений, поэтому более естественно разместить библиотеки DLL в каталоге на пути поиска. Почему не системный каталог, раз это был предпочтительный способ (AFAIK)? Заранее спасибо за помощь   -  person Mawg says reinstate Monica    schedule 20.08.2015
comment
Это никогда не было правильным способом. Системный каталог принадлежит системе, которую MS всегда говорила не изменять. Представьте, что приложение A и приложение B хотят использовать разные версии одной и той же библиотеки DLL. Тогда что. Копирование в каталог приложения не является бременем. Это позволяет вам простой монтаж, изоляцию, самоопределение.   -  person David Heffernan    schedule 20.08.2015
comment
Спасибо за разъяснения. Вы зарабатываете хорошие баллы (+1)   -  person Mawg says reinstate Monica    schedule 20.08.2015


Ответы (2)


Правильное решение - поместить файл драйвера (например, libmysql.dll) в папку вашего приложения или поместить место установки в ваш FDDrivers.ini файл:

[MySQL]
Vendor=<folder>\libmysql.dll

(В последних версиях документации в INI-файле используется VendorLib вместо Vendor.)

См. Разделы документации по RAD Studio Настройка драйверов (FireDAC) и Подключитесь к серверу MySQL (FireDAC) для получения дополнительной информации.

person Ken White    schedule 19.08.2015
comment
Довольно удручающе, что официальная документация, на которую вы ссылаетесь, благословляет системный каталог как звуковое место для этих файлов. - person David Heffernan; 19.08.2015
comment
@David: Windows по умолчанию выполняет поиск в системном каталоге, и в нем все еще устанавливается множество устаревшего программного обеспечения. Если поставщик решил сделать это, логично, что вы должны будете искать в местах поиска системы по умолчанию, а также в своих собственных. Документы ничего не благословляют - они просто объясняют, где будет выглядеть ОС и в каком порядке по умолчанию, а также где выглядит код FireDAC. - person Ken White; 19.08.2015
comment
@ Дэвид: Я поправляюсь. При повторном чтении документации действительно говорится: Вы можете взять их ... и разместить. Вы абсолютно правы - документация неверна. - person Ken White; 19.08.2015
comment
@Ken, я бы сказал, что это так же небезопасно, как и настройка раздела [MySQL] для драйвера СУБД вашего приложения в глобальном FDDrivers.ini файле. Представьте, что произойдет, если каждый предложит свою собственную версию и путь к библиотеке и решит поместить ее в одноименный раздел. - person TLama; 20.08.2015
comment
@TLama: Я ничего не сказал о файле global FDDrivers.ini; Фактически, я сказал ваш файл FDDrivers.ini и указал на документацию о том, где драйверы будут искать файл. Попадание ли это в глобальный файл конфигурации драйвера зависит, конечно, от ваших конкретных обстоятельств; это было бы безопасно для моих приложений (если бы мы использовали FireDAC), потому что мы находимся в контролируемой среде, где мы контролируем все приложения, которые могут быть установлены, и ни один из пользователей не является локальным администратором. (Это рабочая сеть с очень строгими сетевыми ограничениями и групповыми политиками.) - person Ken White; 20.08.2015

Позвольте мне ответить по двум пунктам.

  1. Развивающееся, живое подключение к базе данных! Надеюсь, в вашем модуле данных есть компонент "TFDPhysMySQLDriverLink". Щелкните этот компонент и перейдите к вашей LibMySQL.DLL в VendorLib. Должно быть работать. Но только во время разработки.
  2. Время выполнения. Надеюсь, ваш DM был создан первым в вашем проекте. В событии DM OnCreate вы должны отключить свою библиотеку (я всегда запускал свой проект без подключения к базе данных) и заменить Vendorlib «TFDPhysMySQLDriverLink» на LibMySQL.DLL (который копируется в файл, который копируется там, где находится сгенерированный .EXE )

Хорошего дня!

person Kefealo    schedule 21.08.2015