Форум: "Базы";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2006.06.18;
Скачать: [xml.tar.bz2];




Вниз

SQL в {CONSOLE APPLICATION} 


h8394E   (2006-04-18 02:13) [0]

Доброго времени суток!
Мне надо обралиться к базе данных FireBird 2.0 из моего консольного приложения. Выполнить SQL запрос из переменной типа TStringList и получить ответ. Конечно, можно скачать FIB компоненты и во время выполнения моей программы выделить память и создать их, они-то VCL. Есть ли просто модули какие-нибудь, чтоб быстренько подключиться, дать логин, пароль, выполнить запрос, получить ответ и всё запомнить? А то мне не очень нравится создание DataBase, Querry и Transaction компонентов в консоли...



Sergey Masloff   (2006-04-18 06:12) [1]

h8394E   (18.04.06 02:13)  
>А то мне не очень нравится создание DataBase, Querry и Transaction компонентов в консоли...
Почему? Им параллельно где их создают.

Напрямую можно используя клиентский API InterBase. Я тут приводил как-то примитивный код. Спрашивавший решил что ну его на фиг лучше создать компоненты ;-)))

Пример на це см. в
{FBDir}/Examples/Api3.c

Переписать на паскале не проблема но код еще увеличится да и заголовки свежие паскалевские искать надо будет



Desdechado ©   (2006-04-18 11:30) [2]

TDatabase и TQuery вовсе не обязательно бросать на форму или датамодуль, чтоб ими воспользоваться
достаточно сделать
qry:=TQuery.Create( Application ) // зацепит в себя модуль Forms
или
qry:=TQuery.Create( nil ) // нет хозяина у компонента, ОБЯЗАТЕЛЬНО вручную разрушать

и в finally сделать таким Free



h8394E   (2006-04-18 16:53) [3]

А будет ли это достаточно быстро? В смысле, когда запускаешь форму, в основном, они-то уже подключены к бд. А тут - время на создание, подключение, поиск, анализ и разрешение. Просто моя консоль как cgi подапачем выполняется.



Desdechado ©   (2006-04-18 17:02) [4]

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



h8394E   (2006-04-18 17:57) [5]

Desdechado, к сожалению, ни того ни другого я не знаю... Вот, мне с FireBird 2.0 пришла программа - консоль "Firebird ISQL tool". Может мне через пайпы к ней присоединиться и писать туда?



h8394E   (2006-04-18 18:21) [6]

Или, может вы посоветуете, какую, нить базу данных, что б было легко и быстро делать
> создание, подключение, поиск, анализ и получение ответа



h8394E   (2006-04-18 18:25) [7]

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



Плохиш ©   (2006-04-18 18:37) [8]


> Мне просто не нужны все эти обработки ошибок, откаты о так
> далее.

> В смысле, когда запускаешь форму, в основном, они-то уже
> подключены к бд.

Неужели кому-то ещё нужны такие программы? 8-O



h8394E   (2006-04-18 18:43) [9]

Sergey Masloff,
> Пример на це см. в
> {FBDir}/Examples/Api3.c
>
> Переписать на паскале не проблема но код еще увеличится
> да и заголовки свежие паскалевские искать надо будет


А ты переписать не сможешь? Или может кто знает где найти, а то я в си знаю только что такое
int idiot;



h8394E   (2006-04-18 21:15) [10]

Вот, PHP подключается к базе данных как раз так, как мне надо! У кого-нить есть исходники PHP?



h8394E   (2006-04-19 02:13) [11]

А если я DataModule добавлю. Вставлю туда компоненты и подсоединю их ещё в design-time, это ничего не изменит?



Сокол ©   (2006-04-19 12:29) [12]

Создавай компоненты в runtime, тормозов нет абсолютно никаких, проверено почти на всех БД, только не используй ADO-компоненты - в консольном приложении с ними есть проблеммы.



Desdechado ©   (2006-04-19 12:35) [13]

я ж говорил - основные тормоза при подключении к БД
если у тебя подключение единожды, то все и без датамодуля работать будет
если оно у тебя для каждого обращения к cgi извне, то будут тормоза в любом случае



Сокол ©   (2006-04-19 12:43) [14]

Тормоза при подключении у меня были только с СУБД IBM DB2, работающе по OS/400 на серверах iSeries AS/400, с остальными все нормально. Хотя здесь все еще зависит от железа, на котором работаешь.



atruhin ©   (2006-04-19 13:13) [15]

Нет ни каких проблем с консольным подключением. При запуске программы содаешь и подключаешь Database, остальное по мере надобности. Только IB компненты по моему всегда тянут VCL, поэтому советую купить FIB, там есть опция - не использовать VCL



jack128 ©   (2006-04-19 14:38) [16]

Сокол ©   (19.04.06 12:29) [12]
Создавай компоненты в runtime, тормозов нет абсолютно никаких, проверено почти на всех БД, только не используй ADO-компоненты - в консольном приложении с ними есть проблеммы

? Почему?  Если ты забыл com инициализировать, то это еще не проблема..

atruhin ©   (19.04.06 13:13) [15]
Только IB компненты по моему всегда тянут VCL,

нет, не тянут они VCL

program Project3;
uses
 SysUtils, Forms;
begin
end.

занимает 387082, а

program Project3;
uses
 SysUtils, IBDatabase;
begin
end.
304640.  Делай выводы.
PS Delphi2006



atruhin ©   (2006-04-19 14:47) [17]


> нет, не тянут они VCL

Посмотрел, согласен ошибся. Я с ними не работаю по тому и написал - по моему :). В FIB отдельная директива компиляции, но все равно советую их купить, если с FB работать. Причин достаточно.



sniknik ©   (2006-04-19 15:02) [18]

в D7 всетаки, чтото тянут. надо все initialization в модуле просмотреть...

program Project1;
begin
end.
- 14 848

program Project1;
uses
SysUtils;
begin
end.
- 40 448

program Project1;
uses
SysUtils, IBDatabase;
begin
end.
- 285 184

D7 соответственно.



sniknik ©   (2006-04-19 15:04) [19]

да, с формами (SysUtils, Forms;) - 367 616
для полноты картины.



h8394E   (2006-04-19 15:48) [20]

Размер моей программы не важен! А подключение к базе будет делаться два запроса из трёх, т.е. только 3й запрос не обращается к бд.
Мне тут всё-таки скорость важна. Моя машина P4 3200 MHz 1024мб ОЗУ 500Гб HDD(кеш - 16мб).
Так же хотел спросить, а если я старым методом делать буду, т.е.:

Type TFileData = record
a, b, c:integer;
d, e, f:char;
end;

var
DataFile:file of TFileData;
fileData:TFileData;

bagin
AssignFile(DataFile, "c:\file.dat");
//НУ И ТАК ДАЛЕЕ

Это будет искать(циком) так же, как и FireBird, или медленнее? Есть ли другой метод поиска? Количество записей в базе будет до 15000, с 28 переменными в каждом.



ANB ©   (2006-04-20 12:17) [21]


> h8394E   (19.04.06 15:48) [20]

Какие проблемы ?
В начале своей консольной программы создаешь объект для коннекта и коннектишься.
Можешь сразу насоздавать нужные объекты для выполнения запросов.

Потом, в ходе работы - запихнул SQL запрос в объект и выполнил его. Это будет так же шустро, как при работе в обычном приложении.

Кстати, кто тебе сказал, что если подключение сделать в дизайн-тайме, то будет быстрее ?



ANB ©   (2006-04-20 12:18) [22]


> Type TFileData = record
> a, b, c:integer;
> d, e, f:char;
> end;
>
> var
> DataFile:file of TFileData;
> fileData:TFileData;
>
> bagin
> AssignFile(DataFile, "c:\file.dat");
> //НУ И ТАК ДАЛЕЕ

А вот так ты искать точно повесишься. Для начала нужно будет узнать формат файла БД.



h8394E   (2006-04-20 17:07) [23]

ANB, ты наверное не заметил, что я говорил, что моя консоль - это cgi скрипт. Т.е. она выкидывает в буфер вывода данные и сразу закрывается, по этому мне и нужна скорость.

> А вот так ты искать точно повесишься. Для начала нужно будет
> узнать формат файла БД.

А при чём тут формат файла? Я его сам создаю. Я имел ввиду, а что если базу данных самому так создать? Поиска в ней будет медленнее или такой же? Это даже не база получится а нечто вроде текстового файла.

Также пришла идея - а что если при первом запуске приложения она экспортирует в память dll, в которая подключается к базе данных, но при выходе dll из памяти не удалять. А при повторной загрузке и dll уже загружена будет, и подключена к бд тоже будет. Вот только как такое организовать на Delphi?



atruhin ©   (2006-04-20 19:10) [24]


> ANB, ты наверное не заметил, что я говорил, что моя консоль
> - это cgi скрипт.

Покажи в вопросе или в теме строку где ты говорил, что это cgi скрипт, а то я тоже не заметил.



h8394E   (2006-04-20 19:22) [25]

atruhin, третий пост, последняя строчка:

> Просто моя консоль как cgi под апачем выполняется.



atruhin ©   (2006-04-20 19:40) [26]

С cgi скриптама не работал, но что приходит в голову:
1. избавится от скрипта и реализовать на php и тд.
2. 3 звенка, т.е. сервер приложений+cgi



h8394E   (2006-04-20 19:46) [27]

atruhin, аой 23 пост посмотри - можно ли к бд в dll подключаться, и держать dll всё время?



atruhin ©   (2006-04-20 19:54) [28]

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



Sergey Masloff   (2006-04-20 21:02) [29]

atruhin ©   (20.04.06 19:54) [28]
Нет клиент это веб сервер. Он получает запрос вызывает exe и что тот напишет в STDOUT отдает клиенту. Все.



Sergey Masloff   (2006-04-20 21:05) [30]

Вообще же по сабжу:
1) Измерить производительность в реальных условиях. Может все не так медленно. Само по себе создание процесса дело небыстрое на его фоне может и нормально будет.
2) Сделать сервер приложений cgi будет к нему стучаться за данными. Но межпроцессное взаимодействие тоже не самая быстрая операция.



h8394E   (2006-04-21 00:37) [31]

Sergey Masloff,  а если создавать свой файл с "базой данных", как я показал в примере выше - поиск в нём будет достаточно быстр?



atruhin ©   (2006-04-21 06:11) [32]


> поиск в нём будет достаточно быстр?

Все зависит от задачи, и от того, что ты подразумеваешь под поиском. Но в целом вряд ли ты сам реализуешь поиски из файла быстрее чем это делает SQL сервер



DSKalugin ©   (2006-04-21 17:32) [33]

А что мешает сделать все это на PHP? зачем городить собственнописные подключения к базе, если все это уже сделано?

PHP поддерживает прямую работу с Firebird через клиентскую библиотеку gds32.dll, смотри функции начинающиеся на ibase_*
http://ua.php.net/ibase

P.S. Я сам неоднократно этим пользовался



h8394E   (2006-04-21 21:40) [34]

Хорошо, всем большое спасибо!



Sergey Masloff   (2006-04-21 22:09) [35]

atruhin ©   (21.04.06 06:11) [32]
>Все зависит от задачи, и от того, что ты подразумеваешь под поиском. Но в >целом вряд ли ты сам реализуешь поиски из файла быстрее чем это делает >SQL сервер
Да ну ;-)
Смотря сколько данных в файле. Если строк с 1000 скажем из файла прямым перебором будет намного быстрее без всяких усилий.



atruhin ©   (2006-04-21 22:25) [36]


> Смотря сколько данных в файле.



> Количество записей в базе будет до 15000, с 28 переменными
> в каждом.

Все таки думаю сервер быстрее справится. Я не рассматриваю вариант организации индекса.



Sergey Masloff   (2006-04-21 22:43) [37]

atruhin ©   (21.04.06 22:25) [36]
Никаких индексов. Просто тупой перебор. Файл будет быстрее сервера.
Это как раз тот случай когда нужно не думать а проверять.
Том Кайт в своих статьях и книгах постоянно приводит примеры что бывает когда люди слишком много думают и слишком мало проверяют результаты своих измышлений ;-)))



atruhin ©   (2006-04-22 06:54) [38]

Посмотри первоначальный пост. Т.е. программа на каждый запрос загружается и выгружается. Соответственно: Считать весь файл (15000 записей*28 полей), произвести поиск, закрыть файл. У сервера файл в кэше + поиск по индексам. Эх быстрее будет.



Sergey Masloff   (2006-04-22 07:12) [39]

atruhin ©   (22.04.06 06:54) [38]
У ОС файл тоже в кеше ;-)
Я действительно число записей просмотрел. На паре тысяч записей перебор файла быстрее интербеза, оракла и mssql и намного - я проверял ;-)




Форум: "Базы";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2006.06.18;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.81 MB
Время: 0.063 c
2-1149249027      XTD                   2006-06-02 15:50  2006.06.18  
Unsatisfied forward or external declaration: ????


15-1148563350     Pger                  2006-05-25 17:22  2006.06.18  
Работа через прокси


15-1148392394     oldman                2006-05-23 17:53  2006.06.18  
Как быть в случае отсутствия 8w???


3-1145542831      Sphinx                2006-04-20 18:20  2006.06.18  
Невизуальные компоненты для БД


2-1149108787      Nonamers              2006-06-01 00:53  2006.06.18  
ShellExecute