Форум: "Базы";
Текущий архив: 2002.11.18;
Скачать: [xml.tar.bz2];
ВнизОпределение структуры бд Найти похожие ветки
← →
13-ый (2002-10-28 00:24) [0]есть произвольная база в формате dbf. надо программно получить её структуру, т.е. - тип полей, размер.
если с первым ясно, то со вторым возникают проблемы с типом float - как определить размер части после запятой ?!
для доступа использую Halcyon работающий через tdataset
← →
Bsl (2002-10-28 08:06) [1]А демки Дельфовые смотреть пробовал - там, вроде, есть.
← →
Vovchik_A (2002-10-28 16:18) [2]Ну наверняка свойство FieldDefs никто не отменял в Halcyon
← →
kudatsky (2002-10-28 17:08) [3]Процедура CopyStru анализирует структуру DBF-файла и создаёт SQL-оператор CREATE TABLE, соответствующий этой структуре. Этот оператор загружается в Query и выполняется, создавая пустой DBF-файл той же структуры.
Поля процедуры CopyStru:
DataSet - TTable или TQuery. Перед выполнением здесь должен быть открыт DBF-файл, структура которого копируется.
TablePath - полный путь к директории, в которой должен быть создан DBF-файл.
Query - сюда загружается оператор CREATE TABLE. Перед выполнением процедуры CopyStru должен быть закрыт.
Если в директории уже есть файл с тем-же именем, его нужно перед выполнением процедуры уничтожить, в противном случае BDE возбудит исключение.
unit CreateSQL;
interface
Uses DB,DBTables,Classes,BDE,SysUtils;
procedure CopyStru(DataSet:TBDEDataSet;TablePath:String;Query:TQuery);
Function SQLType(FldType,SubType,Units1,Units2:Integer):String;
implementation
procedure CopyStru;
var
pfldDes, pCurFld: pFLDDesc;
i: integer;
MemSize: integer;
S:String;
Prop:CurProps;
begin
Query.SQL.Clear;
Check(DbiGetCursorProps(DataSet.Handle, Prop));
Prop.exltMode:=xltField;
Query.SQL.Add("Create table ""+TablePath+"\"+Prop.szName+".dbf""+#13#10+"(");
// Зарезервировать память под описатели полей
MemSize := DataSet.FieldCount * SizeOf(FLDDesc);
pfldDes := AllocMem(MemSize);
try
pCurFld := pfldDes;
Check(DbiGetFieldDescs(DataSet.Handle, pfldDes));
for I:=0 to DataSet.FieldCount-1 do
begin
S:=pCurFld^.szName+" "+SQLType(pCurFld^.iFldType,pCurFld^.iSubType,
pCurFld^.iUnits1,pCurFld^.iUnits2);
if I < DataSet.FieldCount-1 then S:=S+",";
Query.SQL.Add(S);
inc(pCurFld);
end;
finally
FreeMem(pfldDes, MemSize);
end;
S:=Query.SQL[0];
Query.SQL.Add(")");
Query.ExecSQL;
end;
//------------------------------------------------------------------------------
Function SQLType(FldType,SubType,Units1,Units2:Integer):String;
begin
Case FldType of 1: Result:="CHAR("+IntToStr(Units1)+")";
2: Result:="DATE";
3: begin
Case SubType of
22: Result:="BLOB(1,1)"; //Memo
28: Result:="BLOB(1,2)"; //Binary
27: Result:="BLOB(1,4)"; //OLE
end;
end;
4: Result:="BOOLEAN";
5,7: begin
Result:="NUMERIC("+IntToStr(Units1);
if Units2 > 0 then
Result:=Result+","+IntToStr(Units2)+")"
else
Result:=Result+")"
end;
end;
end;
end.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2002.11.18;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.009 c