Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Определение индексов при создании таблицы в Builder (http://forum.oszone.net/showthread.php?t=173991)

Apock 24-04-2010 22:45 1400081

Определение индексов при создании таблицы в Builder
 
Доброго времени суток всем. Нужна помощь такого плана - пишу прогу на С++ Builder 6. При вводе кое-каких данных и нажатии на кнопку должна создаваться таблица(если её ещё нет) и вноситься в неё данные. В суть программы думаю вникать не буду сейчас, так как не в этом суть. Примерный код такой:
Код:

AnsiString b=ComboBox4->Text+".db";//таблица имеет имя, вводимое или выбираемое в списке
  if(access(b.c_str(),0)!=0)//проверяем существование таблицы
 {
  Table1->Active = false; // Компонент TTable должен быть отключен.
// Опишем параметры таблицы.
  Table1->DatabaseName = "AceLet";//БД
  Table1->TableType = ttParadox; //как обычно, Парадокс.
// Опишем поля и их типы.
  Table1->FieldDefs->Clear();
  TFieldDef *pNewDef=Table1->FieldDefs->AddFieldDef();
    pNewDef->Name="Date";// Дата матча
    pNewDef->DataType=ftDate;//тип поля
    pNewDef->Required=true;
  pNewDef=Table1->FieldDefs->AddFieldDef();
    pNewDef->Name="Name";// имя
    pNewDef->DataType=ftString;//тип поля
    pNewDef->Size=15;
//установим, является ли поле обязательным
  pNewDef=Table1->FieldDefs->AddFieldDef();
    pNewDef->Name="sex";// пол, принимает значения 1 или 0. Можно было сделать тип boolean, но что-то не могу с ним разобраться
    pNewDef->DataType=ftInteger;//тип поля
  pNewDef=Table1->FieldDefs->AddFieldDef();
    pNewDef->Name="Ageh";// возраст1.
    pNewDef->DataType=ftInteger;//тип поля
  pNewDef=Table1->FieldDefs->AddFieldDef();
    pNewDef->Name="Agea";// возраст3.
    pNewDef->DataType=ftInteger;//тип поля
  pNewDef=Table1->FieldDefs->AddFieldDef();
    pNewDef->Name="Age2h";// возраст4.
    pNewDef->DataType=ftInteger;//тип поля
  pNewDef=Table1->FieldDefs->AddFieldDef();
    pNewDef->Name="Age2a";// возраст5.
    pNewDef->DataType=ftInteger;//тип поля
//следующие поля просто создаются, данные в них вносятся с другой формы позже
  pNewDef=Table1->FieldDefs->AddFieldDef();
    pNewDef->Name="Red";// цвет
    pNewDef->DataType=ftInteger;//тип поля
  pNewDef=Table1->FieldDefs->AddFieldDef();
    pNewDef->Name="Yel";// цвет2.
    pNewDef->DataType=ftInteger;//тип поля
  pNewDef=Table1->FieldDefs->AddFieldDef();
    pNewDef->Name="Place";// место.
    pNewDef->DataType=ftInteger;//тип поля
// Теперь взялись за индексы
  Table1->IndexDefs->Clear();
  TIndexDef *newIndexDef = Table1->IndexDefs->AddIndexDef();
    newIndexDef->Name = "T3";
    newIndexDef->Fields = "Date";
    newIndexDef->Options = TIndexOptions() << ixPrimary << ixUnique;

// Ну и наконец, создаем таблицу.
  Table1->CreateTable();
  Table1->Active=true;
  Table1->Append();
  Table1->FieldValues["Date"] = DateTimePicker1->Date;
  Table1->FieldValues["Name"] = ComboBox4->Text;
  Table1->FieldValues["sex"] = 0;
  if(RadioButton1->Checked==false)
  {
    Table1->FieldValues["Ageh"] = CSpinEdit1->Value;
    Table1->FieldValues["Ageа"] = CSpinEdit2->Value;
  }
  Table1->FieldValues["Age2h"] = CSpinEdit3->Value;
  Table1->FieldValues["Age2а"] = CSpinEdit4->Value;
  Table1->Post();
  Table1->ApplyUpdates();
  }
//если таблица существует, то просто вносим данные
  else
      {
      Table1->Active=true;
      Table1->Append();
      Table1->FieldValues["Date"] = DateTimePicker1->Date;
      Table1->FieldValues["Name"] = ComboBox3->Text;
      Table1->FieldValues["sex"] = 1;
      if(RadioButton1->Checked==false)
      {
        Table1->FieldValues["Ageh"] = CSpinEdit1->Value;
        Table1->FieldValues["Ageа"] = CSpinEdit2->Value;
      }
      Table1->FieldValues["Age2h"] = CSpinEdit3->Value;
      Table1->FieldValues["Age2а"] = CSpinEdit4->Value;
      Table1->Post();
      Table1->ApplyUpdates();
      }

Проблема с описанием индексов. Сокращаю создаваемую таблицу до двух полей - всё ОК. Ставлю, как в данном примере - выползает "Key Violation" и хоть об стену убейся. Пробовал ставить для каждого поля, начиная со второго ещё индексы, типа
Table1->IndexDefs->Add("Fld5Index","Agea", TIndexOptions() << ixCaseInsensitive);
, тоже никакого изменения.
Подскажите, что не так. А то в сети решения на Key Violation больше на отмазки похожи.


Время: 12:21.

Время: 12:21.
© OSzone.net 2001-