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

ЖАНРЫ

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

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

Шрифт:

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. 

Существует ли средство для вывода определения структуры таблицы?

Я создал таблицу и хочу получить её структуру, чтобы сделать изменённый оператор создания таблицы.

Nomadic отвечает:

Для этого существует утилита DB2LOOK. Она находится в SQLLIB\MISC.

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

CONNECT TO SAMPLE USER xxx USING yyy

DB2LOOK –d SAMPLE –u xxx –e –t employee

Вывод может быть перенаправлен в файл. Полный синтаксис выдаётся по команде:

DB2LOOK ?
 

У меня есть текстовые файлы, которые я хочу использовать в запросах к DB2, но не хочу создавать из них постоянные таблицы в базе. Что делать?

Nomadic отвечает:

Можно воспользоваться табличными функциями (Table Functions). Они позволяют использовать файлы как таблицы. Примеры приведены в руководстве «Embedded SQL Programming Guide».

Список структуры полей таблицы

В данном проекте создается список структуры полей соответствующей таблицы, с использованием массивов Fields и IndexDefs, который затем отображается в компоненте ListBox. Демонстрационный проект (dbbrowsr.dpr) решает эту задачу несколько иначе. Вы можете сравнить две версии этого кода.

Примечание: Данный код работает только в 16-битной среде.

procedure TForm1.Button1Click(Sender: TObject);

const MyFielddefs: array[ftUnknown..ftGraphic] of string [8] = ('Unknown', 'String', 'Smallint', 'Integer', 'Word','Boolean', 'Float', 'Currency', 'BCD', 'Date','Time', 'DateTime', 'Bytes', 'VarBytes', 'Blob','Memo', 'Graphic');

var

 i, Indx: integer;

 Definition: string;

begin

 for  i := 0 to Table1.FieldCount - 1 do begin

Definition := Table1.Fields[i].DisplayLabel;

Definition := Definition + ' ' +MyFieldDefs[Table1.Fields[i].DataType];

Table1.IndexDefs.Update;

Поделиться с друзьями: