Полная версия этой страницы:
Создание сетевой БД
Programmer_Hard
29:11:2006, 13:52
Здравствуйте
Делаю Сетевую БД . Принцип простой - клиент-приложение делает запрос к БД сервер-приложения . и получает результат.
Посоветуйте, кто знает, какие компоненты нужно испальзовать?
Может эти (TIBTable TIBQuery TIBDatabase)
Morpheus
29:11:2006, 13:58
Цитата(Programmer_Hard @ 29:11:2006, 15:52 )
А с чего вы взяли что это называеться сетевая БД... судя по описанию вы делаете 3-х звенку
а 3х звенка делается, ну например , на сокетах
З,Ы,
]]><<ADO & COM или SQL-сервер своими руками.>>]]>]]><<Как писать DataSet>>]]>]]><<COM. Автоматизация - от простого к сложному>>]]> и
]]><<Midas и COM. Советы и Приемы>>]]> +
]]><<сокет сервер>>]]>
Может ошибаюсь, но по-моему это двухзвенка, и можно обойтись, например, ADO или dbExpress
Morpheus
30:11:2006, 06:51
Для:
SNikeдавайте расуждать
1. Есть клиент
2. Есть сервер который обрабатывает запросы клиента, и общаеться с БД
3. У афтара нет ещё БД, возможно он воьмёт какуюнибуть локальную (Парадокс, аксес и т.д....)
Возможно! автор хочет обьеденить 2 + 3 и зделать СУБД...
З,Ы,
]]><< Похожий топик >>]]>
Programmer_Hard
3:12:2006, 12:36
-> Morpheus Все так и есть.
Я сделал так: взял Query1,Table1, DBGrid1, DataSourse1 и создал локальную БД - получил "сервер-прилож-е".
Затем я создал "приложение-клиент" аналогичное предыдущему "сервер-прилож-ю", но без источника данных.
"Приложение-клиент" посылает "сервер-прилож-ю" SQL -запрос в чистом виде c помощью SendText().
"Cервер-прилож-е" в ответ на этот запрос формир-ет таблицу-результат.
Меня интересует: как эту таблицу переслать клиенту через сокеты ? НЕ знаю как выделить отдельную запись и обратиться к полю в нем.
Результат выполнения запроса SQL содержащего "SELECT", выполненного в приложении-сервер называется "курсор", он содержит в себе отобранные по "SELECT" записи.
То что в приложении-клиент нужно создавать DataSet - это 100-пудово и обращаться с ним как с обычной БД. А вот как в него передать курсор от DataSet приложения-сервера не знаю. Но если учесть, что в курсоре может быть несколько миллионов записей - это должна быть часть курсора или какой-то указатель.
Цитата(Morpheus @ 30:11:2006, 09:51 )

давайте расуждать
...
В общем-то все зависит от конкретного случая, потому трудно что-либо конкретное сказать по общей формулировке. Если захочет создать свои бизнес-правила - тогда трехзвенка. Но судя по всему, т.к. есть вопрос о том какие VCL использовать, проще начать с обычного клиент-сервера. Опять же, все зависит от постановки задачи и исходных факторов...
Я полазил по данном вопросу и пришёл к выводу, что роль серверной части заключается в основном синхронизации работы клиентских частей и взятию на себя основной обработки данных. По этому, собственно, ничего кроме управляющих (синхронизирующих) команд с приложения-сервера и не должно передаваться на приложение-клиента. Приложение-клиент может вполне забирать результат обработки данных приложением-сервер прямо с сервера БД. Например с помощью виртуальных таблиц если результат хранить не надо.
Например: приложение-клиент хочет отредактировать запись. Посылается запрос в приложение-сервер на выделение записи для редактирования. Приложение-сервер смотрит свободна ли запись, блокирует ее и разрешает редактирование приложению-клиенту. При этом считывание и обновление записи происходит с клиента прямо на сервер БД. После успешного редактирования на приложение-сервер посылается команда об отмене блокировки записи. Также приложение-сервер должно известить остальные клиенты о том, что запись изменилась.
По моему так проще и быстрее чем пробрасывать данные через приложение-сервер.
Остаётся вопрос об уязвимости открытого порта сервера БД. Но думаю, что здесь всё можно решить авторизацией и тунелированием данных (что-то типа VPN) между хостами.
Programmer_Hard
7:12:2006, 12:30
еще вопрос по работе с DBGrid
После выполнения SQL запроса его результат заносится в DBGrid:
Query1->Open();
DataSource1->DataSet = Query1;
Теперь нужно отослать содержимое DBGrid через сокет
Из таблицы я отсылал так:
ServerSocket1->Socket->Connections[0]->SendText(Table1->FieldByName("Fio")->AsString +
"\n"+
Table1->FieldByName("Kol")->AsInteger +
"\n"+
Table1->FieldByName("Price")->AsInteger);
... а как из DBGrid не знаю, подскажите.
8<----------------- ????
з.ы. юзай тэг [code]
Непонятно, зачем тебе получать данные из DBGrid если он, DBGrid показыает то, что есть в Table1.
Чем плох вышеописанный тобой способ?
Programmer_Hard
8:12:2006, 10:29
Цитата
Непонятно, зачем тебе получать данные из DBGrid если он, DBGrid показыает то, что есть в Table1.
Чем плох вышеописанный тобой способ?
LAW-> При обработке запроса клиента Select данные в основной таблице не изменяются, результат отображается только в дбгрид путем Query1->Open(); DataSource1->DataSet = Query1;. соответсвенно я не могу взять данные из таблицы.
А насчет виртуальных таблиц не знаю , подскажи
Если грид подключен к квери, то точто в гриде, то и в квери. Нужны данные из грида - читай квери.
Query1->First();
while(!Query1->Eof)
{
'Результат1'=Query1->FieldByName("Поле1")->As'Тип';
'Результат2'=Query1->FieldByName("Поле2")->As'Тип';
/////
Query1->Next;
}
Таким образом внутри каждого прохода цикла считываются все поля одной записи.
Грид тоже можно как-то прочитать, но я ещё не встречал пока такой надобности.
Сорри если есть ошибки. Писал на коленке.
Programmer_Hard
9:12:2006, 18:18
Спасибо, разобрался ,сделал
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.