Icon Frequently Asked Questions

How do I create a table from an existing TEDBTable/TEDBQuery's field definitions (FieldDefs property), similar to the CreateTable method in DBISAM ?

The following function will do what you want:

uses edbcomps, edbconfig, edbstring;

function CheckIdentifier(const Value: String): String;
begin
  Result:=MakeValidIdentifier(Value);
  if (Length(Result) > IDENTIFIER_LENGTH) then
     Result:=Copy(Result,1,IDENTIFIER_LENGTH);
end;

function GetCreateTableStatement(DataSet: TEDBDataSet;
                                const TableName: String;
                                TemporaryTable: Boolean=False): String;
var
  TempTableName: String;
  TempSQL: TStrings;
  I: Integer;
  TempFieldName: String;
  TempFieldSQL: String;
begin
  TempSQL:=TStringList.Create;
  try
     TempTableName:=CheckIdentifier(TableName);
     with DataSet do
        begin
        Open;
        FieldDefs.Update;
        if TemporaryTable then
           TempSQL.Add('CREATE TEMPORARY TABLE '+QuotedString(TempTableName,'"'))
        else
           TempSQL.Add('CREATE TABLE '+QuotedString(TempTableName,'"'));
        TempSQL.Add('(');
        for I:=0 to FieldDefs.Count-1 do
           begin
           TempFieldName:=CheckIdentifier(FieldDefs[I].Name);
           TempFieldSQL:=QuotedString(TempFieldName,'"')+' '+
                    UpperCaseString(FieldTypeToSQL(FieldDefs[I].DataType,
                                                   FieldDefs[I].Size));
           {$IFDEF D10ORHIGHER}
           if (FieldDefs[I].DataType in [ftWideString,ftFixedWideChar,
                                         ftString,ftFixedChar,ftGUID,ftWideMemo,
                                         ftMemo]) then
           {$ELSE}
           if (FieldDefs[I].DataType in [ftWideString,ftString,ftFixedChar,ftGUID,
                                         ftMemo]) then
           {$ENDIF}
              TempFieldSQL:=TempFieldSQL+' COLLATE '+QuotedString(GetCollationForField(FieldDefs[I].Name),'"');
           if (I < (FieldDefs.Count-1)) then
              TempFieldSQL:=TempFieldSQL+',';
           TempSQL.Add(TempFieldSQL);
           end;
        TempSQL.Add(')');
        Result:=TempSQL.Text;
        end;
  finally
     FreeAndNil(TempSQL);
  end;
end;
Image