Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Формат и размер dBase-поля

Delphi , Базы данных , DBASE и DBF

Формат и размер dBase-поля

Автор: Eryk Bottomley

Во время выполнения программы мне необходимо получать размеры и десятичные порядки полей таблицы DBase.

Следующий код иллюстрирует необходимые вызовы BDE:


procedure GetdBaseFieldTypes(t: TTable; var l: TStringList);
var
  pF: pFLDDesc;
  cProps: CURProps;
  p: pFLDDesc;
  i: Byte;
  w: Word;
  s: string;
  oldmode: LongInt;
begin
  Check(DbiGetCursorProps(t.Handle, cProps));
  Check(DbiGetProp(hDBIObj(t.Handle), curXLTMODE, oldmode, SizeOf(LongInt), w));
  Check(DbiSetProp(hDBIObj(t.Handle), curXLTMODE, LongInt(xltNONE)));
  try
    if MaxAvail < (cProps.iFields * SizeOf(FLDDesc)) then
      raise EOutofMemory.Create('Недостаточно памяти для процесса');
    GetMem(pF, (cProps.iFields * SizeOf(FLDDesc)));
    Check(DbiGetFieldDescs(t.Handle, pF));
    p := pF;
    for i := 1 to cProps.iFields do
    begin
      with p^ do
      begin
        s := IntToStr(iFldNum) + ' : ' + StrPas(szName) + ' : ';
        case iFldType of
          fldDBCHAR:
            begin { Char string, строка символов }
              s := s + 'CHARACTER(' + IntToStr(iUnits1) + ')';
            end;
          fldDBNUM:
            begin { Number, число }
              s := s + 'NUMBER(' + IntToStr(iUnits1) + ',' + InttoStr(iUnits2) +
                ')';
            end;
          fldDBMEMO:
            begin { Memo (blob), МEMO-BLOB-поле }
              s := s + 'MEMO';
            end;
          fldDBBOOL:
            begin { Logical, лочическая величина }
              s := s + 'LOGICAL';
            end;
          fldDBDATE:
            begin { Date, поле даты }
              s := s + 'DATE';
            end;
          fldDBFLOAT:
            begin { Float, числа с плавающей точкой }
              s := s + 'FLOAT(' + IntToStr(iUnits1) + ',' + InttoStr(iUnits2) +
                ')';
            end;
          fldDBLOCK:
            begin { Логический тип LOCKINFO }
              s := s + 'LOCKINFO';
            end;
          fldDBOLEBLOB:
            begin { OLE object (blob), OLE-объект, BLOB-поле }
              s := s + 'OLE';
            end;
          fldDBBINARY:
            begin { Binary data (blob), двоичные данные, BLOB-поле }
              s := s + 'BINARY';
            end;
        else
          s := s + 'НЕИЗВЕСТНО';
        end;
      end;
      l.Add(s);
      Inc(p);
    end;
  finally
    Check(DbiSetProp(hDBIObj(t.Handle), curXLTMODE, oldmode));
    FreeMem(pF, (cProps.iFields * SizeOf(FLDDesc)));
  end;
end;

Привет! Я переведу контент на русский язык.

Код-снippet - это процедура Delphi под именем GetdBaseFieldTypes, которая извлекает типы полей и соответствующие свойства из таблицы DBase с помощью Borland Database Engine (BDE). Процедура принимает объект TTable в качестве входного параметра, представляющего таблицу DBase для запроса, и возвращает список строк, содержащих имена полей вместе с их типами и свойствами.

Вот разбивка того, что код делает:

  1. Сначала процедура извлекает свойства курсора для указанной таблицы с помощью DbiGetCursorProps. Функция хранит информацию о текущем положении курсора в базе данных.
  2. Затем процедура устанавливает режим xltNONE, который позволяет ей доступ к описателям полей.
  3. Блок памяти выделяется с помощью GetMem для хранения описателей полей. Размер этого блока рассчитывается на основе количества полей в таблице и размера одиночного описателя поля (FLDDesc).
  4. Процедура затем вызывает DbiGetFieldDescs, чтобы извлечь фактические описатели полей для каждого поля в таблице.
  5. Она проходит по каждому полю, извлекает его свойства и конструирует строковое представление имени поля вместе с его типом и свойствами. Эта информация хранится в списке (TStringList), передаваемом в качестве параметра выхода.
  6. Наконец, она освобождает выделенный блок памяти с помощью FreeMem и восстанавливает режим курсора до его оригинального значения.

Код использует несколько констант из библиотеки BDE, таких как curXLTMODE и SizeOf(FLDDesc), которые используются для установки и извлечения свойств объекта базы данных. Исключение EOutofMemory генерируется, если не хватает памяти для процесса.

Для улучшения содержимого следующие предложения:

  1. Добавьте комментарии, объясняющие, что каждый раздел кода делает.
  2. Рассмотрите добавление механизмов обработки ошибок для обработки потенциальных проблем, которые могут возникнуть при выполнении.
  3. Вы можете также рассмотреть оптимизацию кода, уменьшая количество проверок и условных операторов.
  4. Код работает нормально с BDE, но было бы хорошо включить примечание о версии Delphi, с которой этот код совместим.

В отношении предложений по альтернативному решению:

  1. Если вы хотите использовать более современную библиотеку базы данных вместо BDE (что не рекомендуется для новых проектов), рассмотрите использование FireDAC или dbExpress.
  2. Альтернативно, если вы работаете над legacy-проектом и нужно продолжать использовать BDE, можно рассмотреть переписывание кода с использованием более эффективной или легкой в обслуживании подхода.

Обратите внимание, что предоставленный код является quite специфичным для Delphi и BDE, поэтому может не быть легко адаптируемым к другим языкам программирования или библиотекам базы данных.

В статье рассмотрен код на языке Delphi, который позволяет получать размеры и десятичные порядки полей таблицы DBase.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: DBASE и DBF ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-01-28 05:53:59/0.0036959648132324/0