Всем доброго дня! Как создать базу данных в процессе работы программы. Работаю в C++ Builder, с базой соединяюсь через ADOConnect, данные читаю через ADOQuery.
Create Database пробовал, но не получилось, с ним у меня связано много вопросов, на которые интернет ответа пока не дал.
Пока для попробовать выбрал базу Accsess. С остальными, я думаю, будет полная аналогия. При создании базы в запросе имя базы - это имя будущего файла, к которому потом будет автоматом добавлено расширение или что-то иное, с чем будет необходимо сопоставить имя файла базы данных? (насколько я понял, в имени базы запрещается использование символов служебных, включая точку, а значит и указание расширения файла). При открытии базы через ADOConnect я подсоединяюсь к базе данных и использую его для связи ADOQuery с базой. Как в запросе указать местоположение будущей базы данных помимо её имени и нужен ли для этого ADOConnect. Это те самые вопросы, на которые не могу найти ответ.
Для Access можно использовать COM объект "c:\Program Files\Common Files\System\ado\msadox.dll", например на Делфях так : Код (Text): function CreateMDB(const FileName: string): Boolean; var Catalog: OLEVariant; begin Catalog := CreateOleObject('ADOX.Catalog'); try Catalog.create('Provider=Microsoft.Jet.OLEDB.4.0;Data Source=' + '"' + FileName + '";'); Catalog := Unassigned; Result := True; except on E: Exception do begin Result := False; DatabaseError(E.Message); end; end; end; Не будет.
Для Access можно использовать COM объект "c:\Program Files\Common Files\System\ado\msadox.dll", например на СиБлиндере так : Код (Text): //--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include <Forms.hpp> #include <comobj.hpp> #include <sysvari.h> #include <DB.hpp> //--------------------------------------------------------------------------- int CreateMDB(const char* FileName) { Variant Catalog; AnsiString ConnectionString; try { ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="; ConnectionString = ConnectionString + FileName; Catalog = CreateOleObject("ADOX.Catalog"); Catalog.Exec(Procedure("create") << ConnectionString); Catalog = Unassigned; return 1; } catch(const Exception& e) { DatabaseError(e.Message); return 1; } } //--------------------------------------------------------------------------- WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) { try { Application->Initialize(); CreateMDB("BcbTest.mdb"); } catch (Exception &exception) { Application->ShowException(&exception); } catch (...) { try { throw Exception(""); } catch (Exception &exception) { Application->ShowException(&exception); } } return 0; } //--------------------------------------------------------------------------- Не будет.
Это всё здорово, когда-то я такой вариант попробовал и он, по-моему, даже работал. Но хочется полнее разобраться с запросами. Допустим, через ADOConnect подсоединяемся к базе данных (там же указывается имя файла базы). Если файл базы данных не обнаружен, вернётся сообщение об ошибке. Далее выполняем запрос CreateDatabase <database name>, где указываем имя будущей базы данных (имя файла базы или что-то отвлечённое?). Для ADOQuery источником данных является ADOConnect, который на этот момент ни куда не ссылается, потому, что файл базы отсутствует. Соответственноо, каким образом ADOQuery будет знать, какого формата база должна быть создана. Быть может формат запроса CreateDatabase <database name> более сложен, чем я думаю, но другого не в книгах, не в нете я не находил.
В 1-м стандарте языка SQL (1986 год) нет CreateDatabase и каждая СУБД реализовала эту операцию по своему. Думаю, что общего универсального способа не существует. Последний стандарт (SQL2008) тут: http://www.iso.org/iso/iso_catalogue.htm Я не читал, он слишком сложен и огромен.
А можно ли каким-то образом увеличить быстродействие работы с базами Access. Слышал, что в ВижуалС всё работает гораздо быстрее (это всё же продукт от того же Microsoft, что и Access). Время записи данных из файла в базу составляет примерно 140 сек (26 500 записей по 11 полей), если использовать запрос INSERT.