Как программно изменить LangDriver для таблиц dBase и Paradox

Советы » Paradox » Как программно изменить LangDriver для таблиц dBase и Paradox

Откpываешь help и смотpишь:

......
var

List:TStrings; ....... BEGIN

....... List.Add ( 'LANGDRIVER=db866ru0 '); ....... Session.ModifyDriver( 'DBASE', List ); ....... END

;

Это действие я пpовожy пеpед откpытием таблицы

Это о "русификации" таблицы. В таблицах dBase и Paradox имеется байт, который определяет CodePage содержимого таблицы. Раньше он не использовался и был зарезервирован. Тебе нужно его правильно установить. Это делается через DBD Restructure table. Если хочешь программно, можешь воспользоваться следующей процедурой:

uses

DbiTypes, DbiProcs, DbiErrs, DB, WinProcs, SysUtils; procedure

ChangeLangDriver(DatabaseName, TableName, LDName: string

); var

TblExt: string

; Database: TDatabase; TblDesc: CRTblDesc; OptDesc: FLDDesc; OptData: array

[0..250] of

Char; Cur: hDBICur; Rec: CFGDesc; begin

if

(TableName = '') or

(LDName = '') then

raise

Exception.Create('Unknown TableName or LDName'); Database := Session.OpenDatabase(DatabaseName); try

if

Database.IsSQLBased then

raise

Exception.Create( 'Function ChangeLangDriver working only with dBase or Paradox tables'); FillChar(OptDesc, SizeOf(OptDesc), #0); FillChar(TblDesc, SizeOf(TblDesc), #0); StrCopy(OptDesc.szName, 'LANGDRIVER'); OptDesc.iLen := Length(LDName) + 1; with

TblDesc do

begin

StrPCopy(szTblName, TableName); TblExt := UpperCase(ExtractFileExt(TableName)); if

TblExt = 'DBF' then

StrCopy(szTblType, szDbase) else

if

TblExt = '.DB' then

StrCopy(szTblType, szParadox) else

begin

AnsiToOEM(StrPCopy(OptData, DatabaseName), OptData); if

DbiOpenCfgInfoList(nil

, dbiREADONLY, cfgPersistent, StrPCopy(OptData, 'DATABASES' + StrPas(OptData) + 'DB INFO') Cur) <> DBIERR_NONE then

raise

Exception.Create('Unknown table type'); try

while

DbiGetNextRecord(Cur, dbiNOLOCK, @Rec, nil

) <> DBIERR_EOF do

if

StrComp(Rec.szNodeName, 'DEFAULT DRIVER') = 0 then

begin

StrCopy(szTblType, Rec.szValue); Break; end

; finally

Check(DbiCloseCursor(Cur)); end

; end

; iOptParams := 1; pfldOptParams := @OptDesc; pOptData := @OptData; end

; StrPCopy(OptData, LDName); Check(DbiDoRestructure(Database.Handle, 1, @TblDesc, nil

, nil

, nil

, False

)); finally

Session.CloseDatabase(Database); end

; end

;

Примеры использования:

ChangeLangDriver( 'DBDEMOS', 'EMPLOYEE', 'ancyrr' );
ChangeLangDriver( 'DBDEMOS', 'EMPLOYEE.DB', 'ancyrr' );
ChangeLangDriver( 'C:DELPHIDEMOSDATA', 'CLIENTS.DBF', 'db866ru0' ); 

LDName

:
для D1 - имя .LD файла в каталоге IDAPILANGDRV; для D2 и CB - из BDECFG32.HLP поле Short name в табличке по указателю language drivers, dBASE или поле Internal в табличке по указателю language drivers, Paradox;
для D3 и выше - не знаю так как у меня её нет, но думаю, что также, как и в D2.

Другое по теме:

Категории

Статьи

Советы

Copyright © 2022 - All Rights Reserved - www.delphirus.com