Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Создание сетевой БД
Форум программистов > Системное программирование > C, С++ и С Builder > Borland C++ Builder & Kylix
Programmer_Hard
Здравствуйте
Делаю Сетевую БД . Принцип простой - клиент-приложение делает запрос к БД сервер-приложения . и получает результат.
Посоветуйте, кто знает, какие компоненты нужно испальзовать?
Может эти (TIBTable TIBQuery TIBDatabase)
Morpheus
Цитата(Programmer_Hard @ 29:11:2006, 15:52 )
Делаю Сетевую БД
*

А с чего вы взяли что это называеться сетевая БД... судя по описанию вы делаете 3-х звенку

а 3х звенка делается, ну например , на сокетах

З,Ы,
]]><<ADO & COM или SQL-сервер своими руками.>>]]>

]]><<Как писать DataSet>>]]>

]]><<COM. Автоматизация - от простого к сложному>>]]> и ]]><<Midas и COM. Советы и Приемы>>]]> + ]]><<сокет сервер>>]]>
SNike
Может ошибаюсь, но по-моему это двухзвенка, и можно обойтись, например, ADO или dbExpress
Morpheus
Для: SNike
давайте расуждать
1. Есть клиент
2. Есть сервер который обрабатывает запросы клиента, и общаеться с БД
3. У афтара нет ещё БД, возможно он воьмёт какуюнибуть локальную (Парадокс, аксес и т.д....)

Возможно! автор хочет обьеденить 2 + 3 и зделать СУБД...

З,Ы, ]]><< Похожий топик >>]]>
Programmer_Hard
-> Morpheus Все так и есть.
Я сделал так: взял Query1,Table1, DBGrid1, DataSourse1 и создал локальную БД - получил "сервер-прилож-е".
Затем я создал "приложение-клиент" аналогичное предыдущему "сервер-прилож-ю", но без источника данных.
"Приложение-клиент" посылает "сервер-прилож-ю" SQL -запрос в чистом виде c помощью SendText().
"Cервер-прилож-е" в ответ на этот запрос формир-ет таблицу-результат.

Меня интересует: как эту таблицу переслать клиенту через сокеты ? НЕ знаю как выделить отдельную запись и обратиться к полю в нем.
LAW
Результат выполнения запроса SQL содержащего "SELECT", выполненного в приложении-сервер называется "курсор", он содержит в себе отобранные по "SELECT" записи.
То что в приложении-клиент нужно создавать DataSet - это 100-пудово и обращаться с ним как с обычной БД. А вот как в него передать курсор от DataSet приложения-сервера не знаю. Но если учесть, что в курсоре может быть несколько миллионов записей - это должна быть часть курсора или какой-то указатель.
SNike
Цитата(Morpheus @ 30:11:2006, 09:51 ) *
давайте расуждать
...


В общем-то все зависит от конкретного случая, потому трудно что-либо конкретное сказать по общей формулировке. Если захочет создать свои бизнес-правила - тогда трехзвенка. Но судя по всему, т.к. есть вопрос о том какие VCL использовать, проще начать с обычного клиент-сервера. Опять же, все зависит от постановки задачи и исходных факторов...
LAW
Я полазил по данном вопросу и пришёл к выводу, что роль серверной части заключается в основном синхронизации работы клиентских частей и взятию на себя основной обработки данных. По этому, собственно, ничего кроме управляющих (синхронизирующих) команд с приложения-сервера и не должно передаваться на приложение-клиента. Приложение-клиент может вполне забирать результат обработки данных приложением-сервер прямо с сервера БД. Например с помощью виртуальных таблиц если результат хранить не надо.
Например: приложение-клиент хочет отредактировать запись. Посылается запрос в приложение-сервер на выделение записи для редактирования. Приложение-сервер смотрит свободна ли запись, блокирует ее и разрешает редактирование приложению-клиенту. При этом считывание и обновление записи происходит с клиента прямо на сервер БД. После успешного редактирования на приложение-сервер посылается команда об отмене блокировки записи. Также приложение-сервер должно известить остальные клиенты о том, что запись изменилась.
По моему так проще и быстрее чем пробрасывать данные через приложение-сервер.
Остаётся вопрос об уязвимости открытого порта сервера БД. Но думаю, что здесь всё можно решить авторизацией и тунелированием данных (что-то типа VPN) между хостами.
Programmer_Hard
еще вопрос по работе с 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]
LAW
Непонятно, зачем тебе получать данные из DBGrid если он, DBGrid показыает то, что есть в Table1.
Чем плох вышеописанный тобой способ?
Programmer_Hard
Цитата
Непонятно, зачем тебе получать данные из DBGrid если он, DBGrid показыает то, что есть в Table1.
Чем плох вышеописанный тобой способ?

LAW-> При обработке запроса клиента Select данные в основной таблице не изменяются, результат отображается только в дбгрид путем Query1->Open(); DataSource1->DataSet = Query1;. соответсвенно я не могу взять данные из таблицы.
А насчет виртуальных таблиц не знаю , подскажи
LAW
Если грид подключен к квери, то точто в гриде, то и в квери. Нужны данные из грида - читай квери.
Query1->First();
while(!Query1->Eof)
  {
     'Результат1'=Query1->FieldByName("Поле1")->As'Тип';
     'Результат2'=Query1->FieldByName("Поле2")->As'Тип';
     /////
     Query1->Next;
  }

Таким образом внутри каждого прохода цикла считываются все поля одной записи.
Грид тоже можно как-то прочитать, но я ещё не встречал пока такой надобности.

Сорри если есть ошибки. Писал на коленке.
Programmer_Hard
Спасибо, разобрался ,сделал smile.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2008 IPS, Inc.