1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62:
| 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; |