Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.04.16;
Скачать: CL | DM;

Вниз

Indy (IdTCPServer & TIdTCPClient)   Найти похожие ветки 

 
Fl@sh ©   (2006-03-20 22:00) [0]

Доброе время суток.
Я создавал тут ветку про клиент банк.
Начал изучение IdTCPServer & TIdTCPClient. Создал програмку для суммы чисел. Простенький пример. Но это начало. Еще нашел пример для выборки из таблицы. Это делается в IdTCPServerExecute.
Но тут только селект с базы. А мне надо будет делать и селекты, инсерты..
Как это сделать, просветите!


 
Reindeer Moss Eater ©   (2006-03-20 22:03) [1]

Как делать селекты и инсерты узнают в конференции "Базы"


 
Fl@sh ©   (2006-03-21 11:50) [2]


> Reindeer Moss Eater ©   (20.03.06 22:03) [1]

Да это я знаю как делается!
Мне помощь нужна в другом.
Клиент связывается с сервером, а тот в свою очередь работает с базой, проверяет пароли, проверяет хеш...
Так вот, я так понял что описывать надо в TidTcpServer.Execute
Ну например я напишу там код для инсерт, а для селекта где писать?
Блин даже не знаю как обьяснить?
Давайте так, у сервера уже есть код инсерт, и когда я конекчусь к серверу у меня идет запись в базу.
А потом мне нужен селект, но кода нет, надо посылать параметры какие то, или как это сделать?
Надеюсь, я уже доступно описАл проблему.


 
Reindeer Moss Eater ©   (2006-03-21 11:51) [3]

Удалено модератором


 
Reindeer Moss Eater ©   (2006-03-21 11:55) [4]

А впрочем вот тебе ответ:
код селекта пиши там же, после кода инсерта.


 
Сергей М. ©   (2006-03-21 11:55) [5]


> Блин даже не знаю как обьяснить


И даже не в "Базы", а в "Начинающим"..

Цитата оттуда:


> Конференция для .. тех, кому сложно объяснить чего он хочет


 
Fl@sh ©   (2006-03-21 15:02) [6]

Ладно, давайте по другому.
Берем компонент TidTcpClient
Свойство CommandHandlers
делаю итем
пишу
command = quit
replinormal.numericcode= 200
replinormal.text = bla-bla-bla
когда подключаюсь через телнет:
telnet 127.0.0.1 6002
quit
сервер делает команду и
lost connection
А как с клиента подать ему команду и получить ответ?


 
Fl@sh ©   (2006-03-21 15:03) [7]


> Reindeer Moss Eater ©   (21.03.06 11:55) [4]
>
> А впрочем вот тебе ответ:
> код селекта пиши там же, после кода инсерта.

Ну да, например юзер хочет только посмотреть клиентов, нафиг ему инсерт?


 
Reindeer Moss Eater ©   (2006-03-21 15:09) [8]

А тебе он зачем? Этот инсерт?
Зачем спросил про него?


 
Fl@sh ©   (2006-03-21 15:13) [9]


> Reindeer Moss Eater ©   (21.03.06 15:09) [8]

Да я не спрашивал. Это просто для примера.
Во, только что дошло.
Свойство CommandHandlers - это командные обработчики.
Тоесть например одному я призначу делать select c бази
другому еще кокое нибудь действие
Но как их вызвать с клиента.
По другому не представляю себе как можно сделать сервер, чтоб он обслуживал запросы клиента.
Если можно то как. Уже 3-й день пытаюсь сделать и неполучается.


 
Reindeer Moss Eater ©   (2006-03-21 15:15) [10]

Если можно то как. Уже 3-й день пытаюсь сделать и неполучается.

Это судьба. От судьбы не уйдешь.


 
Fl@sh ©   (2006-03-21 15:35) [11]


> Это судьба. От судьбы не уйдешь.

Не, не убедили.
Мне б написать этот проэктик и все успоколся б.
С crypto api разобрался с firebird тоже, но вот с сервером никак.

Подскажите как это делается?
Может есть пример, манюсенький, но понятный и доступный.


 
Anatoly Podgoretsky ©   (2006-03-21 15:58) [12]

У вас что банковские проекты студенты пишут?
Названия банка в студию.


 
Reindeer Moss Eater ©   (2006-03-21 16:00) [13]

Банк Возрождения Ёжиков.


 
Сергей М. ©   (2006-03-21 16:02) [14]


> но вот с сервером никак.


А анализ исходных текстов компонента, очевидно, - для Пушкина ..


 
Knight ©   (2006-03-21 16:04) [15]


> [12] Anatoly Podgoretsky ©   (21.03.06 15:58)
> У вас что банковские проекты студенты пишут?
> Названия банка в студию.

Судя по тем программа, которые подсовывают нашей администрации... я всё больше начинаю в это верить... нормальные прогеры ТАКОЕ писать не могут!


 
Fl@sh ©   (2006-03-21 17:06) [16]


> Anatoly Podgoretsky ©   (21.03.06 15:58) [12]


Noname - я ж говорил это тестовый вариант для лабораторных.
Это для универа!
И кроме того хочу набраться немного опыта.
И многое не прошу!
Вот сейчас есть вот такой код:
procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
var
 cust: integer;
begin
 with AThread.Connection do
 try
   try
     cust := StrToIntDef(ReadLn, 0);
     if cust = 0 then
     begin
       WriteLn("Not Found zero value");
       Exit;
     end;

     DataModule2.SQLDataSet1.Params[0].Value := cust;
     DataModule2.SQLDataSet1.Open;
     if DataModule2.SQLDataSet1.IsEmpty then
       WriteLn("Not Found is empty")
     else
     WriteLn(DataModule2.SQLDataSet1.Fields[0].AsString +
     "contact name is"+
     DataModule2.SQLDataSet1.Fields[1].AsString + " " +
     DataModule2.SQLDataSet1.Fields[2].AsString);
     except

     end;
   finally
     Disconnect
   end;

end;

Делает селект из таблицы.
Если запускаю через telnet то выдает только одну запись.
А вот как запустить с клиента, и вставить данные в grid.
Неужели так много прошу?


 
Reindeer Moss Eater ©   (2006-03-21 17:09) [17]

DataModule2.SQLDataSet1.Params[0].Value := cust;

Почему именно DataModule2 ?
Клиентских соединений может быть много.
Каждому из них нужна своя сессия с БД, свой экземпляр модуля данных.


 
Fl@sh ©   (2006-03-21 18:25) [18]

Ок, давай так:

procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
var
cust: integer;
begin
with AThread.Connection do
try
  Datamodule2 := Tdatamodule.Create;
  try
    cust := StrToIntDef(ReadLn, 0);
    if cust = 0 then
    begin
      WriteLn("Not Found zero value");
      Exit;
    end;

    DataModule2.SQLDataSet1.Params[0].Value := cust;
    DataModule2.SQLDataSet1.Open;
    if DataModule2.SQLDataSet1.IsEmpty then
      WriteLn("Not Found is empty")
    else
    WriteLn(DataModule2.SQLDataSet1.Fields[0].AsString +
    "contact name is"+
    DataModule2.SQLDataSet1.Fields[1].AsString + " " +
    DataModule2.SQLDataSet1.Fields[2].AsString);
    except

    end;
  finally
    Disconnect;
    DataModule2.Free;  
  end;

end;

Так уже нормально?


 
Reindeer Moss Eater ©   (2006-03-21 19:51) [19]

>Так уже нормально?
Так еще хуже.
Datamodule2 := Tdatamodule.Create;

Ты создал утечки памяти.
На сём с тобой заканчиваю.


 
Fl@sh ©   (2006-03-21 21:43) [20]

Так покажы как должно быть.
Для этого ж ведь существуют форумы


 
Fl@sh ©   (2006-03-21 21:44) [21]

Я ж не пришол сюда хамить, а пришол за ответом, кот. мне очень нужен


 
Fl@sh ©   (2006-03-22 12:17) [22]


> Reindeer Moss Eater ©   (21.03.06 19:51) [19]

Согласен, там я был неправ.
вот правильный вариант:
procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
var  
 cust: Integer;  
 DataModule: TDataModule2;  
begin  
 with AThread.Connection do  
 try  
   try  
     DataModule := TDataModule2.Create(nil);
     try  
       cust := StrToIntDef(ReadLn, 0);
       if cust = 0 then
       begin
         WriteLn("Not found");
         Exit;
       end; // if cust = 0
       DataModule.SQLDataSet1.Params[0].Value := cust;
       DataModule.SQLDataSet1.Open;
       if DataModule.SQLDataSet1.IsEmpty then
         WriteLn("Not found.")
       else
         WriteLn(DataModule.SQLDataSet1.Fields[0].AsString +
           " contact name is "+
           DataModule.SQLDataSet1.Fields[1].AsString + " " +
           DataModule.SQLDataSet1.Fields[2].AsString);
     except
       on e: Exception do
       begin
         WriteLn("Error: " + e.Message);
       end; //on
     end; // try
   finally
     DataModule.Free;
   end; // try
 finally
   Disconnect;
 end; //with try
end;

вот запрос: select ERDPOU, NAME, FULLNAME from KLIENT where ERDPOU = :cust
Но тут выводит только одну запись как сделать чтоб выбирались все?


 
Карелин Артем ©   (2006-03-22 12:27) [23]


> Fl@sh ©   (22.03.06 12:17) [22]


> Но тут выводит только одну запись как сделать чтоб выбирались
> все?

Перебирать записи набора данных вас еще не учили в вашем заведении?


 
Карелин Артем ©   (2006-03-22 12:47) [24]

скажем
while not(SQLDataSet1.EOF) do
begin
 И что же тут у нас должно быть написано???
 SQLDataSet1.Next;
end;


 
Fl@sh ©   (2006-03-22 13:15) [25]

Точно,

while not(SQLDataSet1.EOF) do
begin
WriteLn(DataModule.SQLDataSet1.Fields[0].AsString +
" contact name is "+
DataModule.SQLDataSet1.Fields[1].AsString + " " +
DataModule.SQLDataSet1.Fields[2].AsString);
SQLDataSet1.Next;
end;


Через телнет виводит все записи, а клиент нет, тут видимо тоже надо цикл, но на сколько, мне ж неизвесно, сколько записей знайдено.
Вот прога клиента, но выводит только первую запись

procedure TForm1.Button1Click(Sender: TObject);
begin
 with IdTCPClient1 do
 begin
   Connect;
   try
     WriteLn(Edit1.Text);
     //как тут узнать на сколько ставить цикл
     Memo1.Lines.Text := ReadLn;
   finally
     Disconnect;
   end;
 end;
end;


И еще по ходу один вопрос
Эти данные мне надо будет вставить в базу данных,
это придется анализировать строку, заносить данные вручную, или может есть   чтото типа стрем?


 
Fl@sh ©   (2006-03-22 13:27) [26]


> Вот прога клиента, но выводит только первую запись

Сделал так:
procedure TForm1.Button1Click(Sender: TObject);
var
 s: string;
begin
 with IdTCPClient1 do
 begin
   try
   Connect;
   try
     WriteLn(Edit1.Text);
     s := ReadLn;
     while s <> "" do
     begin
     Memo1.Lines.Add(s);
     s := ReadLn;
     end;
   finally
     Disconnect;
   end;
   except
   end;
 end;
end;

Хотя думаю не лучшее решение.
И вот это уже последний вопрос:

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



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

Текущий архив: 2006.04.16;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.029 c
8-1132159663
Neville
2005-11-16 19:47
2006.04.16
Как остановить звук (Wave)?


2-1143966370
foks-06
2006-04-02 12:26
2006.04.16
Получение координат?


1-1142254492
Nibbler
2006-03-13 15:54
2006.04.16
Работа с содержимым ScrollBox


3-1140354846
Валера
2006-02-19 16:14
2006.04.16
Импорт из Excel в таблицу Paradox


15-1141160566
GanibalLector
2006-03-01 00:02
2006.04.16
Kharkov Mastak Party!!!