Создание БД (MDB) кодом

Разговоры на любые темы: вы можете обсудить здесь какой-либо сайт, найти единомышленников или просто пообщаться...
alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Создание БД (MDB) кодом

Сообщение alibek » 28.05.2006 (Вс) 11:13

Вот такой вот вопросик :)

Вообщем, хочу я, чтобы программа сама создавала базу данных, если таковой не найдено при запуске. У БД есть определенная структура. Также, при создании надо заполнить данными некоотрые таблички.

Велосипед изобретать (создавая БД кодом) мне надоело, хочу сделать, как это принято в цивилизованном мире -- создавать его c помощью SQL DDL.

Теперь, внимание, вопрос :)
Как из MDB получить его DDL?
Самое простое -- преобразовать в MSSQL (MSDE) и каким-нибудь SQL-менеджером посмотреть структуру. Но во-первых, не хочу ставить MSDE, а во-вторых, неужели нет способа проще?
Lasciate ogni speranza, voi ch'entrate.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 28.05.2006 (Вс) 11:44

Ну, вот, в принципе, платный продукт вроде как для этого :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 28.05.2006 (Вс) 11:48

Хм... Ни скриншоты посмотреть, ни описания не почитать, ни триал скачать. Даже цену не посмотреть.
А нет ли чего другого? Желательно бесплатного :)
Lasciate ogni speranza, voi ch'entrate.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 28.05.2006 (Вс) 12:19

Я думаю, ты сам на ADOX быстро напишешь генератор DDL :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 28.05.2006 (Вс) 12:21

Сам спросил, сам ответил :)

http://www.russianit.ru/load/freeware/
http://rsdn.ru/article/files/progs/BatchAccess.xml

Полевые испытания не проводились, но из тестовой базы структуру извлек правильно.
Lasciate ogni speranza, voi ch'entrate.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 28.05.2006 (Вс) 12:34

FW требует - клиенты не будут против? :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 28.05.2006 (Вс) 12:36

Ну эта утилитка нужна только мне :)
Я просто базу рисую в Access, а затем, когда все будет доделано, выгружу в SQL, и этот SQL встрою в программу (в ресурсы или еще куда).
Lasciate ogni speranza, voi ch'entrate.

VVitafresh
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1641
Зарегистрирован: 12.05.2005 (Чт) 14:44
Откуда: Херсон, UA

Сообщение VVitafresh » 28.05.2006 (Вс) 12:47

Есть еще такая ВЕСТЧ Sybase Power Designer-- кроме собственно создания Physical Data Model и кода генерации БД умеет и многое другое. Но, к сожалению, не бесплатно да и размерчик дистрибутива не маленький.
Никакую проблему невозможно решить на том же уровне, на каком она возникла. Нужно стать выше этой проблемы, поднявшись на следующий уровень.

VVitafresh
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1641
Зарегистрирован: 12.05.2005 (Чт) 14:44
Откуда: Херсон, UA

Сообщение VVitafresh » 28.05.2006 (Вс) 13:26

alibek, а как ты будешь SQL из ресурсов применять на стороне клиента без этой утилитки (BatchAccess)?
Никакую проблему невозможно решить на том же уровне, на каком она возникла. Нужно стать выше этой проблемы, поднявшись на следующий уровень.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 28.05.2006 (Вс) 13:28

Сам как думаешь? :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

VVitafresh
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1641
Зарегистрирован: 12.05.2005 (Чт) 14:44
Откуда: Херсон, UA

Сообщение VVitafresh » 28.05.2006 (Вс) 13:33

Ну не знаю :roll:
Наверное, руками через ADOX создавать пустую базу, потом парсить сохраненный набор SQL команд и применять их последовательно...
Только я не в курсе поддерживает ли Access команды DDL в полном объеме (очень сомнительно).
Никакую проблему невозможно решить на том же уровне, на каком она возникла. Нужно стать выше этой проблемы, поднявшись на следующий уровень.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 28.05.2006 (Вс) 13:47

Что значит парсить?
execute()
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

VVitafresh
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1641
Зарегистрирован: 12.05.2005 (Чт) 14:44
Откуда: Херсон, UA

Сообщение VVitafresh » 28.05.2006 (Вс) 14:05

GSerg, хочешь сказать что через execute() можно выполнить нечто такое (сгенерированное BatchAccess):
Код: Выделить всё
-- SQL script generated using BatchAccess utility
-- Tables
CREATE TABLE Manager (
    Birthday                DateTime,
    FirstName               Text(50) NOT NULL,
    LastName                Text(50) NOT NULL,
    manager_id              AutoIncrement NOT NULL,
    MiddleName              Text(50),
    Sex                     Bit NOT NULL,
    CONSTRAINT Manager_PK PRIMARY KEY (manager_id)
);
-- Constraints
-- Indexes
-- Views
-- Procedures
-- End

Не очень то верится...
Никакую проблему невозможно решить на том же уровне, на каком она возникла. Нужно стать выше этой проблемы, поднявшись на следующий уровень.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 28.05.2006 (Вс) 14:17

Несомненно.
Причём даже в Access 97.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

VVitafresh
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1641
Зарегистрирован: 12.05.2005 (Чт) 14:44
Откуда: Херсон, UA

Сообщение VVitafresh » 28.05.2006 (Вс) 14:42

GSerg, я не поленился проверить:
Код: Выделить всё
Private Sub cmdDDL_Click()
    Dim cnAccess As ADODB.Connection
    Dim SQL As String
    Set cnAccess = OpenCnAccess(App.Path & "\test.mdb", "") 'Открываем соединение
   
    SQL = ReadSQL(App.Path & "\test.sql")   'Читаем содержимое файла с SQL-скриптом
    cnAccess.Execute SQL
End Sub

test.mdb -- чистая база, test.sql -- содержимое приведенного ранее SQL-скрипта.
Получаем в результате:
Run-time error:
-2147217900 - Ошибочная инструкция SQL; предполагалось 'DELETE', 'INSERT', 'PROCEDURE', 'SELECT' или 'UPDATE'.

:?: :?: :?:
Никакую проблему невозможно решить на том же уровне, на каком она возникла. Нужно стать выше этой проблемы, поднявшись на следующий уровень.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 28.05.2006 (Вс) 14:51

VVitafresh
Я ведь тоже не поленился проверить.
Ты просто каменты не вырезал. Вырежи.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

VVitafresh
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1641
Зарегистрирован: 12.05.2005 (Чт) 14:44
Откуда: Херсон, UA

Сообщение VVitafresh » 28.05.2006 (Вс) 14:55

Хе-хе.
Так а смысл тогда какой каждый раз комменты вырезать? Так не интересно. Если уж использовать генерилку то так: изменил что-то в базе, сгенерил скрипт, применил его у клиента -- ВСЕ.
Никакую проблему невозможно решить на том же уровне, на каком она возникла. Нужно стать выше этой проблемы, поднявшись на следующий уровень.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 28.05.2006 (Вс) 15:00

Судя по тому, что генерилка выдаёт, она выдаёт это для человека.
Соответственно, либо в ней есть ключик, регулирующий каменты, либо вырезать каменты, ибо в данном случае это просто.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

VVitafresh
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1641
Зарегистрирован: 12.05.2005 (Чт) 14:44
Откуда: Херсон, UA

Сообщение VVitafresh » 28.05.2006 (Вс) 15:20

И все-таки, я думаю, лучше у клиента выполнять DDL по-командно:
во-первых точно будешь знать не каком этапе произошла ошибка (если она есть),
а во-вторых неизвестно еще какой длины SQL-скрипт (даже без комментов) способен принять Access -- подозреваю не очень большой.

Но еще больше мне нравится подход, когда по физической модели генерится полноценный код VB6 создания базы через ADOX -- это реализовано в Sybase Power Designer. Правда, я его не сильно юзал, так посмотрел, покрутил (с наскоку там не сильно разбежишься). Да и не было у меня таких крупных проектов, где это могло бы пригодиться.
Никакую проблему невозможно решить на том же уровне, на каком она возникла. Нужно стать выше этой проблемы, поднявшись на следующий уровень.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 28.05.2006 (Вс) 15:30

VVitafresh
Модуль для создания БД кодом Алибеком выложен давно.
Это именно то, от чего в данном топике стараются уйти.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

VVitafresh
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1641
Зарегистрирован: 12.05.2005 (Чт) 14:44
Откуда: Херсон, UA

Сообщение VVitafresh » 28.05.2006 (Вс) 15:45

GSerg, если ты имеешь в виду: http://bbs.vbstreets.ru/viewtopic.php?t=13474, то это не совсем то, про что я говорил.
Я имел в виду создание полностью готового модуля с кодом на VB, который достаточно подключить к проекту и использовать. Модуль этот генерится по графической схеме БД, в которой указаны типы полей, связи между таблицами и т.п.

Изменил что-то в схеме, сгенерировал код модуля и заменил старую версию -- вот и все что требуется. Но, я думаю, это нужно больше для баз со сложной структурой (десятки и даже сотни таблиц), для более простых такой подход, возможно, и не оправдан.
Никакую проблему невозможно решить на том же уровне, на каком она возникла. Нужно стать выше этой проблемы, поднявшись на следующий уровень.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 29.05.2006 (Пн) 14:07

VVitafresh писал(а):alibek, а как ты будешь SQL из ресурсов применять на стороне клиента без этой утилитки (BatchAccess)?

Ты видимо не понял, что мне нужно.

У меня есть программа, работающая с БД.
Программа должна уметь создавать эту БД самостоятельно.
Писать создание БД (структуры, индексов, изначальных данных) кодом мне лениво, да и неправильно это.
Поэтому я создаю БД в Access, в котором достаточно удобный конструктор. Данными заполняю также в Access, ибо там это достаточно удобно. И запросы отлаживаю тоже в Access -- удобно.
Когда БД будет сделана окончательно, надо чтобы программа умела создавать такую БД с нуля.
Самое простое -- сунуть БД в ресурсы и при необходимости выгружать в файл. Не нравится -- коряво.
Другой вариант -- создавать всю структуру и данные кодом. Не нравится -- неудобно вносить изменения в код при изменении структуры БД, неудобно отлаживать, из кода сложно понять, что за таблица будет.
Третий вариант -- создавать БД SQL-кодом. Нравится -- просто и наглядно, при необходимости SQL-код редактируется в любом редакторе.
Lasciate ogni speranza, voi ch'entrate.

VVitafresh
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1641
Зарегистрирован: 12.05.2005 (Чт) 14:44
Откуда: Херсон, UA

Сообщение VVitafresh » 29.05.2006 (Пн) 14:37

alibek, я прекрасно понял что тебе нужно с самого начала.

Меня заинтересовал вопрос реализации именно завершающего этапа: создание БД SQL-кодом (который описывает структуру) на стороне клиента. Вот именно это мне интересно.
Просто через execute() прогнать весь скрипт, предварительно убрав комменты (как написал GSerg), или как-то иначе?
Последний раз редактировалось VVitafresh 29.05.2006 (Пн) 14:41, всего редактировалось 1 раз.
Никакую проблему невозможно решить на том же уровне, на каком она возникла. Нужно стать выше этой проблемы, поднявшись на следующий уровень.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 29.05.2006 (Пн) 14:40

Фактически, да.
Только не одним большим скриптом, а по скрипту на табличку. И прогресс можно отслеживать, и будет возможность создать не всю БД с нуля, а восстановить только одну или несколько поврежденных таблиц.
Lasciate ogni speranza, voi ch'entrate.


Вернуться в Народный треп

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 141

    TopList