Чтение онлайн

на главную - закладки

Жанры

Советы по Delphi. Версия 1.0.6

Озеров Валентин

Шрифт:

Спасибо за идеи, высказанные в группах новостей и присланные по электронной почте. Я думаю, что нашел лучшее решение.

Очевидно, BDE содержит номер версии структуры, по крайней мере для файлов Paradox. (Я не могу поручиться за dBase и другие форматы.) Всякий раз при изменении структуры (например, в Database Desktop) BDE увеличивает номер версии. Следующий модуль содержит функцию, которая возвращает версию структуры базы данных:

(*****************************************************************************

* DbUtils.pas

*

*
Утилита для работы с базами данных

*

* Создана 09/20/96

*****************************************************************************)

unit Dbutils;

(****************************************************************************)

(****************************************************************************)

interface

(****************************************************************************)

(****************************************************************************)

uses DbTables;

function DbGetVersion(table: TTable): LongInt;

(****************************************************************************)

(****************************************************************************)

implementation

(****************************************************************************)

(****************************************************************************)

uses Db, DbiProcs, DbiTypes, {DbiErrs,} SysUtils;

{---------------------------------------------------------------------------}

(*

* Цель: определение номера версии структуры таблицы

* Параметры: table (I) – интересующая нас таблица

* Возвращаемая величина: номер версии

* Исключительная ситуация: EDatabaseError

*)

function DbGetVersion(table: TTable): LongInt;

var

 hCursor : hDBICur;

 tableDesc: TBLFullDesc;

 cName : array[0..255] of char;

begin

 { копируем имя таблицы в строку 'с' }

 StrPCopy(cName, table.TableName);

 { просим BDE создать запись, содержащую информацию об определенной таблице }

 Check(DbiOpenTableList(table.DBHandle, True, False, cName, hCursor));

 { получаем запись, содержащую информацию о структуре }

 Check(DbiGetNextRecord(hCursor, dbiNOLOCK, @tableDesc, nil));

 { возвращаем поле записи, содержащее номер версии структуры нашей таблицы }

 Result:= tableDesc.tblExt.iRestrVersion;

 Check(DbiCloseCursor(hCursor));

end;

end.

Перемещение

таблиц

Здесь я привожу примеры программ, которые я использую для копирования и удаления таблиц. Необходимые для работы модули: DB, DBTables, DbiProcs,DbiErrs, и DbiTypes. Вам всего лишь необходимо указать каталог расположения, исходное имя таблицы, каталог назначения и имя таблицы, куда будет скопирована исходная таблица и BDE скопирует таблицу целиком со всеми индексами. Процедура удаления в качестве входных параметров использует каталог расположения и имя таблицы, при этом BDE удаляет как саму таблицу, так и все файлы, связанные с ней (индексы и т.п.). Для тестирования данные процедуры были помещены в новое приложение и мне пришлось их немного отредактировать, чтобы удалить некоторые зависимости, которые были связаны с главной формой приложения. Теперь процедуры являются полностью автономными и могут быть помещены в отдельный модуль. (Не забудьте включить его в список используемых модулей). Пользуйтесь на здоровье!

procedure TConvertForm.CopyTable(FromDir, SrcTblName, ToDir, DestTblName: String);

var

 DBHandle: HDBIDB;

 ResultCode: DBIResult;

 Src, Dest, Err: Array[0..255] of char;

 SrcTbl, DestTbl: TTable;

begin

 SrcTbl:= TTable.Create(Application);

 DestTbl:= TTable.Create(Application);

 try

SrcTbl.DatabaseName:= FromDir;

SrcTbl.TableName:= SrcTblName;

SrcTbl.Open;

DBHandle:= SrcTbl.DBHandle;

SrcTbl.Close;

ResultCode:= DbiCopyTable(DBHandle,false,

StrPCopy(Src,FromDir + '\' + SrcTblName), nil, StrPCopy(Dest,ToDir + '\' + DestTblName));

if (ResultCode <> DBIERR_NONE) then begin

DbiGetErrorString(ResultCode,Err);

raise EDatabaseError.Create('При копировании ' + FromDir + '\' + SrcTblName + ' в ' + ToDir + '\' + DestTblName + ' ,' + 'BDE сгенерировал ошибку ''' + StrPas(Err) + '''');

end;

 finally

SrcTbl.Free;

DestTbl.Free;

 end;

end;

procedure TConvertForm.DeleteTable(Dir, TblName: String);

var

 DBHandle: HDBIDB;

 ResultCode: DBIResult;

 tbl, Err: Array[0..255] of char;

 SrcTbl, DestTbl: TTable;

 SrcTbl:= TTable.Create(Application);

Поделиться:
Популярные книги

Сама себе хозяйка

Красовская Марианна
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Сама себе хозяйка

Ученичество. Книга 2

Понарошку Евгений
2. Государственный маг
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Ученичество. Книга 2

Надуй щеки!

Вишневский Сергей Викторович
1. Чеболь за партой
Фантастика:
попаданцы
дорама
5.00
рейтинг книги
Надуй щеки!

На границе империй. Том 9. Часть 4

INDIGO
17. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 9. Часть 4

Эволюционер из трущоб. Том 6

Панарин Антон
6. Эволюционер из трущоб
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Эволюционер из трущоб. Том 6

Идеальный мир для Лекаря 19

Сапфир Олег
19. Лекарь
Фантастика:
юмористическое фэнтези
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 19

Гарем на шагоходе. Том 1

Гремлинов Гриша
1. Волк и его волчицы
Фантастика:
боевая фантастика
юмористическая фантастика
попаданцы
5.00
рейтинг книги
Гарем на шагоходе. Том 1

Академия проклятий. Книги 1 - 7

Звездная Елена
Академия Проклятий
Фантастика:
фэнтези
8.98
рейтинг книги
Академия проклятий. Книги 1 - 7

Беглец

Бубела Олег Николаевич
1. Совсем не герой
Фантастика:
фэнтези
попаданцы
8.94
рейтинг книги
Беглец

Сломанная кукла

Рам Янка
5. Серьёзные мальчики в форме
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Сломанная кукла

Офицер-разведки

Поселягин Владимир Геннадьевич
2. Красноармеец
Фантастика:
боевая фантастика
попаданцы
5.00
рейтинг книги
Офицер-разведки

Имя нам Легион. Том 9

Дорничев Дмитрий
9. Меж двух миров
Фантастика:
боевая фантастика
рпг
аниме
5.00
рейтинг книги
Имя нам Легион. Том 9

(Не)нужная жена дракона

Углицкая Алина
5. Хроники Драконьей империи
Любовные романы:
любовно-фантастические романы
6.89
рейтинг книги
(Не)нужная жена дракона

Этот мир не выдержит меня. Том 2

Майнер Максим
2. Первый простолюдин в Академии
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Этот мир не выдержит меня. Том 2