|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Определение размера результат sql-запроса в байтах
Доброго дня.
Столкнулся со следующей проблемой: нужно определить, сколько байт получено от сервера, в результате получения ответа на запрос "Select ... from ... ...." Коннекчусь через ADO. Асинхронность (Fetch) не поможет - там только счетчик получаемых записей, но не их размер. Как узнать объем полученного пакета? Delphi 2005 / MS SQL Server 2005 |
#2
|
||||
|
||||
А если попробовать количество записей умножить на размер записи (TADOQuery.RecordSize)?
|
#3
|
|||
|
|||
Цитата:
Первая мысль была такая же, но не получается. "Чистый" (т.е. размер записи, согласно занимаемым байтам в зависимости от типа поля) размер записи в БД составляет 265 байт. Свойство RecordSize в Delphi (2005) возвращает 560 байт. Решил допустить, что в в любом случае в передаваемый пакет данных должен содержать (как минимум) признак разделителя полей. Полей 35, значит к 265 плюсуем еще 35 байт, плюс должны быть признаки разделения записей и т.д. Но в любом случае 560 не получается. Потом подумал, что должны передаваться еще и названия полей в пакете, как минимум один раз. Чтобы убедиться в правильности предположения, провел эксперимент - сократил названия полей в БД. Свойство RecordSize не изменилось! Те же самые 560. Причем в БД есть поля нефиксированной переменной длины (varchar), длина которых различается в каждых записях. Это не повлияло на RecordSize - снова 560. Причем выяснилось, что независимо от количество возвращаемых запросом из БД записей, их RecordSize постоянен и неизменен - всегда 560. При сокращении/увеличении количества полей, возвращаемых запросом, размер RecordSize варьировался, но далеко не всегд логичным образом - иногда на меньшее количество полей размер превышал (!) 560 первоначальных байт. Открыл встроенную справку, прочитал про RecordSize, цитирую: Цитата:
Т.е. это свойство возвращает не истинный размер записи, а размер требуемого буфера. Вопрос снова актуален - каким образом можно получить размер возвращаемого sql-запроса? |
#4
|
|||
|
|||
При пробеге и сборе размеров полей в ADOQuery следующим циклом:
Код:
sz:=0; For i:=0 to ADOQMain.Fields.Count-1 do sz:=sz+ADOQMain.Fields.Fields[i].Size; ShowMessage('sz = '+IntToStr(sz)); Это уже ближе к истине, но это меньше 265 байт, которые запись должна занимать в самой БД. |