Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 2 994

/ вопрос открыт /

Здравствуйте, уважаемые эксперты!
Скажите., какие ограничеия на длину строк в Delphi7/2007/2009 ? Как сформировать строку неорганиченной длины чтобы послать через TIdTCPClient и TIdTCPClient?
У меня при пересылке строки длиной около 1000 символов вылетает исключение "Max line length exceeded".
//Пользуюсь Delphi2009. Необходимо сформировать из набора данных в результате запроса к БД строку и переслать клиенту.

Roman Novikov Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Roman Novikov (статус: Посетитель)
Вопрос отправлен: 14 июля 2009, 12:30
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: Вадим К

Здравствуйте, Roman Novikov!
Неограниченной длины никак не получиться. Максимальная длина пока не может превысить 2Гигабайта (в некоторых случаях - 3). Но на самом деле значительно меньше (часть память под саму программу надо и так дальше).
На практике реально выделять строку на несколько миллионов символов без каких то видимых проблем.
PChar использовать можно, но под него надо либо ручками выделять буфер, либо делать ссылку на string - то есть ничего не меняется.
Судя с кода индей - это ограничение внутри. Там есть явная проверка на длину. Как решение - можно строку разбить на несколько подстрок и передавать по очереди. Для сервера с той стороны это не будет проблемой. Потому что даже если с этой отправляется всё в одном пакете, то с той стороны может прийти три пакета. или отправиться два пакета, а прийти три. Но по кол-ву байт будет один в один (если только не будет разрыв связи).

P.S. Передавать серверу SQL запрос в виде строки - большая глупость.

Ответ отправил: Вадим К (статус: Академик)
Время отправки: 14 июля 2009, 13:37
Оценка за ответ: 5


Мини-форум вопроса

Всего сообщений: 46; последнее сообщение — 17 июля 2009, 22:56; участников в обсуждении: 2.

Страницы: [« Предыдущая] [1] [2] [3]

Roman Novikov

Roman Novikov (статус: Посетитель), 17 июля 2009, 15:07 [#41]:

я бы попробывал написать так
sz:Int64;
sz := AContext.Connection.IOHandler.ReadInt64(false);
AContext.Connection.IOHandler.ReadStream(Buf, sz);

Я тоже так подумал, сейчас попробую.
Roman Novikov

Roman Novikov (статус: Посетитель), 17 июля 2009, 16:05 [#42]:

Получилось. Сервер считал и записал файл!-))))))
Ниже работающая процедура.

//Обработка сообщений.
procedure TMainForm.IdTCPServer1Execute(AContext: TIdContext);
var
Buf: TFileStream;
Size: Int64;
begin
try
Size := AContext.Connection.IOHandler.ReadInt64(false);
Buf := TFileStream.Create('bibl.pdf', fmCreate);
RichEdit1.Lines.Append('Начали прием файла');
Buf.position := 0;
AContext.Connection.IOHandler.ReadStream(Buf, Size);
Buf.Free;
RichEdit1.Lines.Append('Закончили прием файла');
except
//RichEdit1.Lines.Append('Ошибка приема файла');
on E: EIdException do ShowMessage('Ошибка сети: ' + E.Message);
on E: Exception do ShowMessage('Ошибка приложения: ' + E.Message);
end;
end;
Roman Novikov

Roman Novikov (статус: Посетитель), 17 июля 2009, 16:07 [#43]:

Вадим, а как вы форматированный код вставляете? тегом <соде>?
У меня нет отступов и подсветки синтаксиса.
Roman Novikov

Roman Novikov (статус: Посетитель), 17 июля 2009, 16:51 [#44]:

Странно, почему-то на одном компе сервер передает клиенту, а в локалке не работает, на клиенте таймаут. Локальная сеть (одноранговая, ноут+стационар, с ICS) настроена, файлы передаются и интернет с обоих компов есть. на клиенте прописал ip правильно.
Roman Novikov

Roman Novikov (статус: Посетитель), 17 июля 2009, 17:02 [#45]:

Брэндмауэр не вылетал, а других файерволов нет.
Roman Novikov

Roman Novikov (статус: Посетитель), 17 июля 2009, 22:56 [#46]:

работает, сеть вылетала

Страницы: [« Предыдущая] [1] [2] [3]

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 26 апреля 2026, 01:43
Выполнено за 0.03 сек.