Announcement

Collapse
No announcement yet.

Fehler bei TTable->CreateTable()

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Fehler bei TTable->CreateTable()

    Hallo,

    ich muss programmgesteuert eine Instanz von "TTable" erstellen.
    Ich habe die obligatorischen Eigenschaften (TableName, TableType (ttASCII), DatabaseName (vorher BDE-ALIAS erstellt), etc. gesetzt.
    Danach habe ich per "Table->FieldDefs->AddFieldDefs" die Felder erstellt.
    Beim Aufruf "CreateTable()" erhalte ich eine EDBEngine-Exception mit der informativen Message "Merkmal nicht verfügbar". Ich finde nirgends eine Erklärung für diese Fehlermeldung. Weiss jemand Rat?

    MfG

    Reiner Ziegler

  • #2
    Hi,

    hmm "Merkmal nicht verfügbar" diese Meldung wird auch ausgegeben
    wenn Du versuchts ein Feld über ein SQL-Statment anzusprechen was
    nicht verhanden ist.
    Wie sieht denn der Quellcode bei dir aus damit man das mal nachvollziehen kann ?

    Gruß
    D

    Comment


    • #3
      Hallo Denis,

      anbei mein Sourcecode, vielleicht kannst Du einen Fehler erkennen.

      MfG

      Reiner
      -----------------------------------------------------------------
      <pre>
      void __fastcall TWbemQuery::CreateDBTable(IWbemClassObject* pObject)
      {
      CIMTYPE lDataType;
      HRESULT hResult;
      TFieldType ftFieldType;
      int nI1;

      try
      {
      TTable* FTable = new TTable(NULL);
      FTable->DatabaseName = "WMIDb";
      FTable->TableName = "WMIResults";
      FTable->TableType = ttASCII;
      FTable->ReadOnly = true;
      FTable->Active = false;
      FTable->FieldDefs->Clear();
      for(nI1 = 0; nI1 < FstrlProperties->Count; nI1++)
      {
      hResult = pObject->Get((BSTR)(WideString)FstrlProperties-
      Strings[nI1], 0,
      NULL, &lDataType, NULL);
      if (!SUCCEEDED(hResult))
      throw EWMIException("WMI-Fehler");
      TField* pNewField = new TField(NULL);
      pNewField->Name = FstrlProperties->Strings[nI1];
      //TFieldDef* pNewDef = FTable->FieldDefs->AddFieldDef();
      //pNewDef->Name = FstrlProperties->Strings[nI1];
      switch(lDataType)
      {
      case CIM_SINT8 :
      case CIM_UINT8 :
      case CIM_SINT16 :
      ftFieldType = ftSmallint; break;
      case CIM_UINT16 :
      ftFieldType = ftWord; break;
      case CIM_SINT32 :
      case CIM_UINT32 :
      ftFieldType = ftInteger; break;
      case CIM_REAL32 :
      case CIM_REAL64 :
      ftFieldType = ftFloat; break;
      case CIM_BOOLEAN :
      ftFieldType = ftBoolean; break;
      case CIM_STRING :
      ftFieldType = ftWideString; break;
      case CIM_DATETIME :
      ftFieldType = ftDateTime; break;
      case CIM_REFERENCE :
      ftFieldType = ftReference; break;
      case CIM_OBJECT :
      ftFieldType = ftVariant; break;
      case CIM_FLAG_ARRAY:
      ftFieldType = ftArray; break;
      default :
      ftFieldType = ftVariant; break;
      }
      pNewField->SetFieldType(ftFieldType);
      //pNewDef->DataType = ftFieldType;
      //pNewDef->FieldNo = nI1;
      FTable->Fields->Add(pNewField);
      }
      FTable->CreateTable();
      for(nI1 = 0; nI1 < FstrlPropKeys->Count; nI1++)
      FTable->AddIndex(AnsiString("Ind" + IntToStr(nI1)),
      FstrlPropKeys->Strings[nI1],
      nI1 == 0 ? TIndexOptions() << ixPrimary <<
      ixCaseInsensitive
      : TIndexOptions() << ixCaseInsensitive,
      AnsiString(""));
      }
      catch(EDBEngineError& objDbErr)
      {
      AnsiString strTemp("");
      int nI1;
      for(nI1 = 0; nI1 < objDbErr.ErrorCount; nI1++)
      strTemp += objDbErr.Errors[nI1]->ErrorCode + ", "
      + objDbErr.Errors[nI1]->Message;
      ShowMessage(strTemp);
      }
      }
      //------------------------------------------------------------------
      </pre&gt

      Comment


      • #4
        Hi,

        Tabellentyp ttAsci unterstützt keine Felddefinitionen. Deshalb die Fehlermeldung.

        Gruß
        Gesin

        Comment

        Working...
        X