Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2006.04.16;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.53 MB
Время: 0.039 c
2-1142484602
de_ICER-T44
2006-03-16 07:50
2006.04.16
требуется помощь dbf excel


2-1143699058
Logos
2006-03-30 10:10
2006.04.16
Формула


1-1140536806
SurgeonY
2006-02-21 18:46
2006.04.16
Linking VC++ static lib in Delphi (or BCB) project


3-1140528041
TTT_111
2006-02-21 16:20
2006.04.16
Неизвестное программное исключение


1-1142232526
Guf
2006-03-13 09:48
2006.04.16
Не прямоугольные кнопки и прозрачные формы





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский