FAQ - Вопросы - ответы - советы - Базы данных
Вопрос:
[PDX,DBF] Как программно изменить LANGDRIVER для таблиц DBASE и PARADOX?
Ответ:
Открываешь HELP и смотришь:
....... VAR LIST:TSTRINGS; ....... BEGIN ....... LIST.ADD ('LANGDRIVER=DB866RU0'); ....... SESSION.MODIFYDRIVER('DBASE',LIST); ....... END;
это действие я провожу перед открытием таблицы
Это о "русификации" таблицы. В таблицах 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:\DELPHI\DEMOS\DATA', 'CLIENTS.DBF', 'DB866RU0'); LDNAME: для D1 - имя .LD файла в каталоге IDAPI\LANGDRV для D2 и CB - из BDECFG32.HLP поле SHORT NAME в табличке по указателю LANGUAGE DRIVERS, DBASE или поле INTERNAL в табличке по указателю LANGUAGE DRIVERS, PARADOX. для D3 - не знаю так как у меня ее нет, думаю, что как и в D2.