Форум: "Прочее";
Текущий архив: 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