Announcement

Collapse
No announcement yet.

TField +invalid Size / type wird nicht übernommen:<

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

  • TField +invalid Size / type wird nicht übernommen:<

    Hi
    Ich versuche die Felder einer adoTabelle dynamisch festzulegen.

    Code:
      for(int i=0;i<datSrc->FieldCount; ++i){
        TFieldDef *def   = datSrc->FieldDefList->operator [](i);
        field->Name      = def->Name;
        field->SetFieldType( def->DataType );
        field->FieldKind = fkData;
        field->Size      = def->Size;
    
        field->Required  = def->Required;
        adoZielTabelle->Fields->Add(field);
      }
    So in der borlandhilfe steht, dass die funktion SetFieldType nix macht, aber der direkte zugriff wird auch verweigert...
    nun frag ich mich, wie man DataType ändern könnte!?!?

    Und anbei noch eine frage:
    Wenn man im "designmodus" ist, kann man ja auf die komponente klicken und die Fleder eintragen. Gibt es den Dialog auch zur laufzeit??

    DANKE, mfg sv

  • #2
    hm, was genau hast Du denn vor?
    .
    Der DataType wird vom Feld in der Datenbank vorgegeben. Diesen kannst Du nicht ändern.
    Persistente Felder lassen sich nicht zur Laufzeit erstellen (wenn ich die Frage richtig verstanden habe).
    .
    Falls Du Änderungen an der Tabellenstruktur vornehmen möchtest, solltest Du dafür SQL-Anweisungen verwenden.
    .
    Wenn Du zur Laufzeit eine Auswahl der Felder ermöglichen möchtest, kannst Du die verfügbaren Felder aus der Tabelle einlesen und ein SQL-Select zusammenstellen, in dem nur die gewünschten Felder gelesen werden.
    .
    Grüße Jochen
    .
    P.S. Die Frage gehört eigentlich in das BDB-Foru

    Comment


    • #3
      Ich habe eine Quelltabelle geöffnet und möchte deren struktur in eine neue adoTabelle übernehmen.

      EDIT: hab grade mal gesucht... müsste ich das dann über ein Command machen??

      Comment


      • #4
        Kann man mit TADOTable überhaupt neue Tabellen erstellen?
        .
        Ich würde es über ein SQL-Statement machen: CREATE TABLE...

        Comment


        • #5
          Hab gerade erst Dein EDIT gesehen...
          Ja. TADOCommand wäre die richtige Komponente

          Comment


          • #6
            Hast du dafür irgendwo ein Beispiel??
            Weil es muss möglichst unabhängig von dem datenbanktyp sein

            Comment


            • #7
              Nun ja, um ganz unabhängig von der verwendeten Datenbank wird schwer. Aber wenn Du dich auf den SQL 92 Standard beschränkst, sollte das auf (fast) allen Datenbanken funktionieren.

              Wesentlich schwieriger ist dann schon die Zugriffsart auf die Datenbank. Hier wird Dir keine andere Wahl bleiben, als Bridge-Pattern zu verwenden (Google mal danach).

              Ansonsten ist eine Tabelle in SQL schnell erstellt:
              ADOCommand1->CommandText = "CREATE TABLE " + QuotedStr("Test.db");
              ADOCommand1->CommandText += "(";
              ADOCommand1->CommandText += "BuMo INTEGER,";
              ADOCommand1->CommandText += "KdNr CHAR(8),";
              ADOCommand1->CommandText += "KdName CHAR(30),";
              ADOCommand1->CommandText += "Umsatz NUMERIC(15,2),";
              ADOCommand1->CommandText += "PRIMARY KEY (BuMo, KdNr)";
              ADOCommand1->CommandText += ")";
              ADOCommand1->Execute()

              Comment

              Working...
              X