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.
