Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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 и намного - я проверял ;-)



Страницы: 1 вся ветка

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

Наверх















Память: 0.97 MB
Время: 0.084 c
2-1149092879
цветог
2006-05-31 20:27
2006.06.18
рекурсия


1-1147183323
DillerXX
2006-05-09 18:02
2006.06.18
Выход из выполняющегося DLL


3-1145550898
-= Acid=-
2006-04-20 20:34
2006.06.18
скорость поиска в ClientDataSet


2-1149061678
Квэнди
2006-05-31 11:47
2006.06.18
Обработка правой клавиши мыши в stringgrid


15-1148282530
АлексейК
2006-05-22 11:22
2006.06.18
К жителям Новосибирска





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский