Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Базы данных
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 22.08.2007, 03:09
Jacky Jacky вне форума
Прохожий
 
Регистрация: 24.06.2007
Адрес: Тюмень
Сообщения: 10
Репутация: 10
По умолчанию Определение размера результат sql-запроса в байтах

Доброго дня.

Столкнулся со следующей проблемой: нужно определить, сколько байт получено от сервера, в результате получения ответа на запрос "Select ... from ... ...."
Коннекчусь через ADO. Асинхронность (Fetch) не поможет - там только счетчик получаемых записей, но не их размер.

Как узнать объем полученного пакета?

Delphi 2005 / MS SQL Server 2005
Ответить с цитированием
  #2  
Старый 22.08.2007, 05:21
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,906
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

А если попробовать количество записей умножить на размер записи (TADOQuery.RecordSize)?
Ответить с цитированием
  #3  
Старый 25.08.2007, 22:49
Jacky Jacky вне форума
Прохожий
 
Регистрация: 24.06.2007
Адрес: Тюмень
Сообщения: 10
Репутация: 10
По умолчанию

Цитата:
Сообщение от Aristarh Dark
А если попробовать количество записей умножить на размер записи (TADOQuery.RecordSize)?

Первая мысль была такая же, но не получается.

"Чистый" (т.е. размер записи, согласно занимаемым байтам в зависимости от типа поля) размер записи в БД составляет 265 байт.

Свойство RecordSize в Delphi (2005) возвращает 560 байт.

Решил допустить, что в в любом случае в передаваемый пакет данных должен содержать (как минимум) признак разделителя полей. Полей 35, значит к 265 плюсуем еще 35 байт, плюс должны быть признаки разделения записей и т.д.

Но в любом случае 560 не получается.

Потом подумал, что должны передаваться еще и названия полей в пакете, как минимум один раз.
Чтобы убедиться в правильности предположения, провел эксперимент - сократил названия полей в БД. Свойство RecordSize не изменилось! Те же самые 560.
Причем в БД есть поля нефиксированной переменной длины (varchar), длина которых различается в каждых записях. Это не повлияло на RecordSize - снова 560.
Причем выяснилось, что независимо от количество возвращаемых запросом из БД записей, их RecordSize постоянен и неизменен - всегда 560.
При сокращении/увеличении количества полей, возвращаемых запросом, размер RecordSize варьировался, но далеко не всегд логичным образом - иногда на меньшее количество полей размер превышал (!) 560 первоначальных байт.

Открыл встроенную справку, прочитал про RecordSize, цитирую:
Цитата:
Description

RecordSize indicates the size needed for internal record buffers. In TDataSet, the value of RecordSize is always 0 because TDataSet does not implement record buffering. Descendant classes that buffer records override the property getter to return the number of bytes in a record buffer.

Т.е. это свойство возвращает не истинный размер записи, а размер требуемого буфера.

Вопрос снова актуален - каким образом можно получить размер возвращаемого sql-запроса?
Ответить с цитированием
  #4  
Старый 25.08.2007, 23:11
Jacky Jacky вне форума
Прохожий
 
Регистрация: 24.06.2007
Адрес: Тюмень
Сообщения: 10
Репутация: 10
По умолчанию

При пробеге и сборе размеров полей в ADOQuery следующим циклом:
Код:
  sz:=0;
  For i:=0 to ADOQMain.Fields.Count-1 do
    sz:=sz+ADOQMain.Fields.Fields[i].Size;
  ShowMessage('sz = '+IntToStr(sz));
, размер пересенной sz = 185 байт (при значения свойства RecordSizw=560).
Это уже ближе к истине, но это меньше 265 байт, которые запись должна занимать в самой БД.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 13:32.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter