• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Создание сетевой БД

  • Автор темы Programmer_Hard
  • Дата начала
P

Programmer_Hard

Здравствуйте
Делаю Сетевую БД . Принцип простой - клиент-приложение делает запрос к БД сервер-приложения . и получает результат.
Посоветуйте, кто знает, какие компоненты нужно испальзовать?
Может эти (TIBTable TIBQuery TIBDatabase)
 
M

morpheus

<!--QuoteBegin-Programmer_Hard+29:11:2006, 15:52 -->
<span class="vbquote">(Programmer_Hard @ 29:11:2006, 15:52 )</span><!--QuoteEBegin-->Делаю Сетевую БД
[snapback]49232" rel="nofollow" target="_blank[/snapback]​
[/quote]
А с чего вы взяли что это называеться сетевая БД... судя по описанию вы делаете 3-х звенку

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

З,Ы,




и +
 
S

SNike

Может ошибаюсь, но по-моему это двухзвенка, и можно обойтись, например, ADO или dbExpress
 
M

morpheus

Для: SNike
давайте расуждать
1. Есть клиент
2. Есть сервер который обрабатывает запросы клиента, и общаеться с БД
3. У афтара нет ещё БД, возможно он воьмёт какуюнибуть локальную (Парадокс, аксес и т.д....)

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

З,Ы,
 
P

Programmer_Hard

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

Меня интересует: как эту таблицу переслать клиенту через сокеты ? НЕ знаю как выделить отдельную запись и обратиться к полю в нем.
 
L

LAW

Результат выполнения запроса SQL содержащего "SELECT", выполненного в приложении-сервер называется "курсор", он содержит в себе отобранные по "SELECT" записи.
То что в приложении-клиент нужно создавать DataSet - это 100-пудово и обращаться с ним как с обычной БД. А вот как в него передать курсор от DataSet приложения-сервера не знаю. Но если учесть, что в курсоре может быть несколько миллионов записей - это должна быть часть курсора или какой-то указатель.
 
S

SNike

давайте расуждать
...

В общем-то все зависит от конкретного случая, потому трудно что-либо конкретное сказать по общей формулировке. Если захочет создать свои бизнес-правила - тогда трехзвенка. Но судя по всему, т.к. есть вопрос о том какие VCL использовать, проще начать с обычного клиент-сервера. Опять же, все зависит от постановки задачи и исходных факторов...
 
L

LAW

Я полазил по данном вопросу и пришёл к выводу, что роль серверной части заключается в основном синхронизации работы клиентских частей и взятию на себя основной обработки данных. По этому, собственно, ничего кроме управляющих (синхронизирующих) команд с приложения-сервера и не должно передаваться на приложение-клиента. Приложение-клиент может вполне забирать результат обработки данных приложением-сервер прямо с сервера БД. Например с помощью виртуальных таблиц если результат хранить не надо.
Например: приложение-клиент хочет отредактировать запись. Посылается запрос в приложение-сервер на выделение записи для редактирования. Приложение-сервер смотрит свободна ли запись, блокирует ее и разрешает редактирование приложению-клиенту. При этом считывание и обновление записи происходит с клиента прямо на сервер БД. После успешного редактирования на приложение-сервер посылается команда об отмене блокировки записи. Также приложение-сервер должно известить остальные клиенты о том, что запись изменилась.
По моему так проще и быстрее чем пробрасывать данные через приложение-сервер.
Остаётся вопрос об уязвимости открытого порта сервера БД. Но думаю, что здесь всё можно решить авторизацией и тунелированием данных (что-то типа VPN) между хостами.
 
P

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<----------------- ????
з.ы. юзай тэг
Код:
[/size][/b][/color]
 
L

LAW

Непонятно, зачем тебе получать данные из DBGrid если он, DBGrid показыает то, что есть в Table1.
Чем плох вышеописанный тобой способ?
 
P

Programmer_Hard

Непонятно, зачем тебе получать данные из DBGrid если он, DBGrid показыает то, что есть в Table1.
Чем плох вышеописанный тобой способ?
LAW-> При обработке запроса клиента Select данные в основной таблице не изменяются, результат отображается только в дбгрид путем Query1->Open(); DataSource1->DataSet = Query1;. соответсвенно я не могу взять данные из таблицы.
А насчет виртуальных таблиц не знаю , подскажи
 
L

LAW

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

Сорри если есть ошибки. Писал на коленке.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!