Ich habe mal zwei Stellen in deinem Code kommentiert.
Eigentlich ist es ganz einfach: du musst nur
ftWord genauso behandeln wie
ftSmallint und
ftInteger.
Delphi-Quellcode:
for i:= 0 to ADOQueryMain.FieldDefList.Count - 1 do begin
// Problem ist Field "RefrainNr"
ShowMessage( 'Field: ' + ADOQueryMain.FieldDefList.FieldDefs[ i ].Name + ', Type: ' + VarToStr( ADOQueryMain.FieldDefList.FieldDefs[ i ].DataType ));
case ADOQueryMain.FieldDefList.FieldDefs[ i ].DataType of
ftAutoInc: t:= 'INTEGER PRIMARY KEY';
ftString: t:= 'VARCHAR( 255 )';
ftWideString, ftWideMemo: t:= 'TEXT';
ftSmallint, ftInteger: t:= 'INTEGER';
// FALSCH - ein Word ist doch auch nur eine Teilmenge von INTEGER
ftWord: t:= 'VARCHAR( 255 )';
ftDateTime: t:= 'DATETIME';
else begin
t:= '!!unbekannt!!';
ShowMessage( t );
end;
....
for i:= 0 to ADOQueryMain.FieldDefList.Count - 1 do begin
if i > 0 then begin
fields:= fields + ', ';
t:= t + ', ';
end;
del:= '';
// FALSCH - ftWord gehört nicht in die folgende Liste
if ADOQueryMain.FieldDefList.FieldDefs[ i ].DataType in [ ftString, ftWord, ftWideString, ftWideMemo, ftDateTime ] then begin
del:= '''';
end;
fields:= fields + ADOQueryMain.FieldDefList.FieldDefs[ i ].Name;
t:= t + del + ADOQueryMain.FieldByName( ADOQueryMain.FieldDefList.FieldDefs[ i ].Name ).AsString + del;
end;