Совместимый DDL (CREATE TABLE) в разных базах данных SQL?

Я работаю над настольным приложением, которое должно поддерживать (в настоящее время) серверные части MS Access и SQL Server. Приложение находится в постоянной разработке, и в базу данных часто вносятся изменения, в основном добавление таблиц и представлений для поддержки новых функций (но также и некоторых DROP и ALTER TABLE для добавления новых столбцов).

У меня есть система, которая компилирует DDL в исполняемый файл, проверяет базу данных, чтобы увидеть, есть ли у исполняемого файла какой-либо новый DDL, который должен быть выполнен, и выполняет его. Это отлично работает для одной базы данных.

Моя непосредственная проблема заключается в том, что SQL Server и Access поддерживают совершенно разные имена для типов данных, поэтому оператор CREATE TABLE, который выполняется для Access, не будет выполняться для SQL Server (или, что еще хуже, будет выполняться, но создаст таблицу с разными типами данных).

Есть ли метод, который можно использовать для создания DDL (особенно команд CREATE TABLE), который может выполняться через ADO для обеих этих баз данных без необходимости создавать отдельный DDL для каждого поставщика?


person Larry Lustig    schedule 18.01.2011    source источник


Ответы (4)


Поскольку вы уже используете ADO, вам следует изучить Microsoft ADOX

Это позволяет вам манипулировать структурами в источнике данных с помощью объектной модели ADO, которая не зависит от базового типа источника данных. т.е. не прибегая к явному DDL

Поддержка ADOX не гарантируется ни одним из поставщиков ADO, и уровень поддержки ADOX может варьироваться, даже если он доступен. Но для MS Access и MS SQL Server, я думаю, вы найдете все необходимые возможности (и, возможно, даже больше!)

person Deltics    schedule 18.01.2011
comment
Можете ли вы предложить учебник или что-то еще по использованию ADOX с Delphi. Я пытался привязать тип libarary, но у меня возникли конфликты с TTable, и я обнаружил, что TCatalog не предоставляет необходимые мне методы (например, возможность установить строку подключения). У меня был больший успех при использовании CreateOLEObject, но у меня был какой-то отказ в разрешении в базе данных SQL Server (несмотря на то, что я могу выдать эквивалентный DDL с той же строкой подключения). - person Larry Lustig; 28.01.2011

Это можно сделать с помощью DBX в Delphi.

Ниже приведены ссылки на образец кода, показывающий, как это можно сделать. http://cc.embarcadero.com/item/26210

person Robert Love    schedule 18.01.2011
comment
Я изучу dbExpress, но я уже довольно далеко продвинулся в этом проекте с ADO. Кстати, поддерживает ли dbExpress JET? - person Larry Lustig; 20.01.2011
comment
Не знаю, есть это или нет. - person Robert Love; 20.01.2011

У меня такая же проблема. Я решил это, применив препроцессор C к SQL перед его выполнением. Препроцессор включает макросы для обработки различных dbs.

Стефано

person Stefano Moratto    schedule 18.01.2011