Создание таблицы

Материал из DRKB

Создание таблицы[править | править код]

uses DB, DBTables, StdCtrls;

procedure TForm1.Button1Click(Sender: TObject);
var
  tSource, TDest: TTable;
begin
  TSource := TTable.create(self);
  with TSource do
  begin
    DatabaseName := 'dbdemos';
    TableName := 'customer.db';
    open;
  end;
  TDest := TTable.create(self);
  with TDest do
  begin
    DatabaseName := 'dbdemos';
    TableName := 'MyNewTbl.db';
    FieldDefs.Assign(TSource.FieldDefs);
    IndexDefs.Assign(TSource.IndexDefs);
    CreateTable;
  end;
  TSource.close;
end;


ID: 02598



// Создание DBF-файла во время работы приложения

const
  CreateTab = 'CREATE TABLE ';
  IDXTab = 'PRIMARY KEY ';
  MyTabStruct =
    'IDX_TAB DECIMAL(6,0), ' +
    'DATE_ DATE, ' +
    'FLD_1 CHARACTER(20), ' +
    'FLD_2 DECIMAL(7,2), ' +
    'FLD_3 BOOLEAN, ' +
    'FLD_4 BLOB(1,1), ' +
    'FLD_5 BLOB(1,2), ' +
    'FLD_6 BLOB(1,3), ' +
    'FLD_7 BLOB(1,4), ' +
    'FLD_8 BLOB(1,5) ';


// создание таблицы без индекса
procedure TForm1.Button1Click(Sender: TObject);
begin
  if CreateTable('"MYTAB.DBF"', MyTabStruct, '') then
    // выполняем дальнейшие операции
end;

// создание таблицы с индексом
procedure TForm1.Button2Click(Sender: TObject);
begin
  if CreateTable('"MYTAB.DBF"', MyTabStruct, IDXTab + ' (IDX_TAB)') then
    // выполняем дальнейшие операции
end;

function TForm1.CreateTable(TabName, TabStruct, TabIDX: string): boolean;
var
  qyTable: TQuery;
begin
  result := true;
  qyTable := TQuery.Create(Self);
  with qyTable do
  try
    try
      SQL.Clear;
      SQL.Add(CreateTab + TabName + '(' + TabStruct + TabIDX + ')');
      Prepare;
      // ExecSQL, а не Open. Иначе ... облом
      ExecSQL;
    except
      // Обработка ошибок открытия таблицы Возможности обработчика можно расширить.
      Exception.Create('Ошибка открытия таблицы');
      result := false;
    end;
  finally
    Close;
  end;
end;


ID: 02599



Как создать таблицу ?

Вариантов несколько:

  1. Сделать это с помощью менеджера соответствующей базы данных, например таблицу для Paradox создать в Paradox'e
  2. С помощью Database Desktop - утилита, поставляемая с BDE и большинством борландовских продуктов. Я не думаю что вы встретите проблемы при создании таблицы - там всё очень просто.
  3. Из программы. Здесь 2 варианта, вариант первый, использовать метод CreateTable у таблицы, вот пример из справки по Дельфи как Борланд предлагает это делать:
with Table1 do begin
  Active := False;
  DatabaseName := 'DBDEMOS';
  TableType := ttParadox;
  TableName := 'CustInfo';
  { Don't overwrite an existing table }
  if not Table1.Exists then
  begin
    { The Table component must not be active }
    { First, describe the type of table and give }
    { it a name }
    { Next, describe the fields in the table }
    with FieldDefs do
    begin
      Clear;
      with AddFieldDef do
      begin
        Name := 'Field1';
        DataType := ftInteger;
        Required := True;
      end;
      with AddFieldDef do
      begin
        Name := 'Field2';
        DataType := ftString;
        Size := 30;
      end;
    end;
    { Next, describe any indexes }
    with IndexDefs do
    begin
      Clear;
      { The 1st index has no name because it is
      { a Paradox primary key }
      with AddIndexDef do
      begin
        Name := '';
        Fields := 'Field1';
        Options := [ixPrimary];
      end;
      with AddIndexDef do
      begin
        Name := 'Fld2Indx';
        Fields := 'Field2';
        Options := [ixCaseInsensitive];
      end;
    end;
    { Call the CreateTable method to create the table }
    CreateTable;
  end;
end;


Есть другой метод, который нравится мне гораздо больше, он проще в реализации и работает стабильнее - выполнить Query типа "Create Table". Этот способ я разберу позже, когда мы будем рассматривать работу с запросами.



sql := 'CREATE TABLE "employee.db" ( '+
       'Last_Name CHAR(20),'+
       'First_Name CHAR(15),'+
       'Salary NUMERIC(10,2),'+
       'Dept_No SMALLINT,'+
       'PRIMARY KEY (Last_Name, First_Name))';
Query1.SQL.Text := sql;
Query1.ExecSQL;


Примечание Vit: этот способ наиболее предпочтительный, так как наиболее стандартный. Кроме того он будет работать практически неизменно на любых базах данных при использовании любого способа доступа, а не только BDE.


Source: Взято с http://delphiworld.narod.ru
ID: 02600