テーブルの作成と削除

提供: RAD Studio
移動先: 案内検索

データセットの理解:インデックス への移動

テーブルタイプのデータセットの中には,設計時でも実行時でも,基になるテーブルの作成と削除が行えるものがあります。通常は,データベースの管理者がデータベーステーブルの作成と削除を行います。しかし,アプリケーションが使用するデータベーステーブルの作成と破棄をアプリケーションの開発時やテスト時に行えれば,便利です。

テーブルの作成

TTableTIBTable では,SQL を使用せずに,基になるデータベーステーブルを作成できます。同様に,TClientDataSet では,データセットプロバイダを操作していないときでも,データセットを作成できます。TTableTClientDataSet を使用する場合は,設計時でも実行時でも,テーブルを作成できます。TIBTable の場合,テーブルを作成できるのは実行時だけです。

テーブルを作成するには,事前にテーブルの構造を指定するプロパティを設定する必要があります。特に,以下の指定が必要です。

  • 新しいテーブルをホストするデータベース。TTable では,DatabaseName プロパティを使ってデータベースを指定します。TIBTable では,TIBDatabase コンポーネントを使用する必要があります。これは,Database プロパティに割り当てられています。クライアントデータセットはデータベースを使用しません。
  • データベースの種類(TTable のみ)。TableType プロパティを目的のテーブルのタイプに設定します。Paradox,dBASE,または ASCII テーブルの場合は,TableType をそれぞれ ttParadoxttDBase,または ttASCII に設定します。それ以外の種類のテーブルについては,TableTypettDefault に設定します。
  • 作成するテーブルの名前。TTableTIBTable には,新しいテーブルの名前を指定するための,TableName プロパティがあります。クライアントデータセットはテーブル名を使用しませんが,新しいテーブルを保存する前に,FileName プロパティを指定してください。既存のテーブルの名前と重複するテーブルを作成した場合,既存のテーブルとそのすべてのデータは新しく作成するテーブルで上書きされます。上書きされたテーブルとそのデータは復元できません。既存のテーブルの上書きを避けるには,実行時に Exists プロパティをチェックします。Exists は,TTableTIBTable でのみ使用可能です。
  • 新しいテーブルのインデックス(オプション)。設計時には,オブジェクトインスペクタIndexDefs プロパティをダブルクリックすれば,コレクションエディタを起動できます。インデックス定義のプロパティを追加,削除,または変更するには,コレクションエディタを使用します。実行時には,既存のインデックス定義をクリアし,AddIndexDef メソッドを使ってそれぞれの新しいインデックス定義を追加します。新しい各インデックス定義について,Data.DB.TIndexDef オブジェクトのプロパティを設定し,インデックスの属性を指定します。
  • 新しいテーブルの項目。これには 2 つの方法があります。
  • FieldDefs プロパティに項目定義を追加する。設計時には,オブジェクトインスペクタFieldDefs プロパティをダブルクリックすれば,コレクションエディタを起動できます。項目定義のプロパティを追加,削除,または変更するには,コレクションエディタを使用します。実行時には,既存の項目定義をクリアし,AddFieldDef メソッドを使ってそれぞれの新しい項目定義を追加します。新しい各項目定義について,Data.DB.TFieldDef オブジェクトのプロパティを設定し,項目の属性を指定します。
  • 静的項目コンポーネントを使用する。設計時には,データセットをダブルクリックすれば,項目エディタを起動できます。項目エディタで,右クリックして[項目の新規作成]コマンドを選択します。項目の基本プロパティを記述します。項目が作成された後は,オブジェクトインスペクタから項目エディタで項目を選択することにより,その項目のプロパティを変更できます。

メモ: 項目定義オブジェクトのかわりに静的項目コンポーネントを使用している場合には,新しいテーブルのためのインデックスを定義することはできません。

設計時にテーブルを作成するには,データセットを右クリックして,[テーブルの作成](TTable)または[データセットの作成](TClientDataSet)を選択します。このコマンドは,必要な情報をすべて指定するまではコンテキストメニューに表示されません。

実行時にテーブルを作成するには,CreateTable メソッド(TTable および TIBTable)または CreateDataSet メソッド(TClientDataSet)を呼び出します。

メモ: 設計時に定義をセットアップしておき,実行時に CreateTable(または CreateDataSet)メソッドを呼び出して,テーブルを作成することができます。しかし,そうするためには,実行時に指定された定義を,データセットコンポーネントとともに保存する必要があることを示さなければなりません。デフォルトでは,項目とインデックスの定義は,実行時に動的に生成されます。定義をデータセットとともに保存するように指定するには,StoreDefs プロパティを True に設定します。

ヒント: TTable を使用する場合には,設計時に,既存テーブルの項目定義とインデックス定義を読み込むことができます。DatabaseName プロパティと TableName プロパティは,既存のテーブルを指定するように設定します。テーブルコンポーネントを右クリックして[テーブル定義の更新]を選択します。これにより,FieldDefs プロパティと IndexDefs プロパティの値が既存テーブルの項目とインデックスを記述するように設定されます。次に,DatabaseNameTableName をリセットして作成するテーブルを指定し,既存テーブルの名前を変更するプロンプト表示はキャンセルします。

メモ: Oracle8 テーブルを作成するときは,オブジェクト項目(ADT 項目,配列項目,およびデータセット項目)は作成できません。

次のコードは実行時に新しいテーブルを作成し,それを DBDEMOS エリアスに関連付けます。新しいテーブルを作成する前に,指定されたテーブル名が既存のテーブル名と重複していないことを確認します。

var
  TableFound: Boolean;
begin
  with TTable.Create(nil) do // 一時的な TTable コンポーネントを作成
  begin
    try
      { 一時的な TTable コンポーネントのプロパティを設定 }
      Active := False;
      DatabaseName := 'DBDEMOS';
      TableName := Edit1.Text;
      TableType := ttDefault;
      { 新しいテーブルの項目定義 }
      FieldDefs.Clear;
      with FieldDefs.AddFieldDef do begin
        Name := 'First';
        DataType := ftString;
        Size := 20;
        Required := False;
      end;
      with FieldDefs.AddFieldDef do begin
        Name := 'Second';
        DataType := ftString;
        Size := 30;
        Required := False;
      end;
      { 新しいテーブルのインデックス定義 }
      IndexDefs.Clear;
      with IndexDefs.AddIndexDef do begin
        Name := ;
        Fields := 'First';
        Options := [ixPrimary];
      end;
      TableFound := Exists; // テーブルが存在するかをチェック
      if TableFound then
        if MessageDlg('Overwrite existing table ' + Edit1.Text + '?',
             mtConfirmation, mbYesNoCancel, 0) = mrYes then
          TableFound := False;
      if not TableFound then
        CreateTable; // テーブルを作成
    finally
      Free; // 終了したら一時的な TTable を破棄
    end;
  end;
end;

TTable *NewTable = new TTable(Form1);
NewTable->Active = false;
NewTable->DatabaseName = "BCDEMOS";
NewTable->TableName = Edit1->Text;
NewTable->TableType = ttDefault;
NewTable->FieldDefs->Clear();
TFieldDef *NewField = NewTable->FieldDefs->AddFieldDef(); // 最初のフィールドを定義
NewField->DataType = ftInteger;
NewField->Name = Edit2->Text;
NewField = NewTable->FieldDefs->AddFieldDef(); // 2 つめのフィールドを定義
NewField->DataType = ftString;
NewField->Size = StrToInt(Edit3->Text);
NewField->Name = Edit4->Text;
NewTable->IndexDefs->Clear();
TIndexDef *NewIndex = NewTable->IndexDefs->AddIndexDef(); // インデックスを追加
NewIndex->Name = "PrimaryIndex";
NewIndex->Fields = Edit2->Text;
NewIndex->Options << ixPrimary << ixUnique;
// このテーブルがすでに存在しているかをチェック
bool CreateIt = (!NewTable->Exists);
if (!CreateIt)
   if (Application->MessageBox((AnsiString("Overwrite table ") + Edit1->Text +
                               AnsiString("?")).c_str(),
                               "Table Exists", MB_YESNO) == IDYES)
    CreateIt = true;
if (CreateIt)
  NewTable->CreateTable(); // テーブルを作成

テーブルの削除

TTableTIBTable では,SQL を使用せずに,テーブルを基になるデータベーステーブルから削除できます。実行時にテーブルを削除するには,データセットの DeleteTable メソッドを呼び出します。たとえば,次の文は,データセットの基礎になるテーブルを削除します。

CustomersTable.DeleteTable;
CustomersTable->DeleteTable();

警告: DeleteTable でテーブルを削除した場合,テーブルとその中のすべてのデータは元に戻せません。

TTable を使用している場合,設計時にテーブルを削除するには,テーブルコンポーネントを右クリックして,コンテキストメニューから[テーブルの削除]を選択することもできます。[テーブルの削除]が表示されるのは,テーブルコンポーネントが既存のデータベーステーブルを表している場合だけです(DatabaseName プロパティと TableName プロパティで既存のテーブルを指定します)。

関連項目