Announcement

Collapse
No announcement yet.

Alter Table (Wert von Scale soll verändert werden)

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

  • Alter Table (Wert von Scale soll verändert werden)

    Hallo <br>
    ich suche eine Möglichkeit via ADO mit einer Abfrage in einer Access2000-Tabelle den Feldtyp von Spalten so zu ändern, dass nur noch zwei NAchkommastellen angezeigt und gespeichert werden können. Der Feldtyp liegt bei double... da die Datenbank schon bei den Benutzern im Einsatz ist, muss ich die Änderung per Programmcode laufen lassen... wie kann ich mit ALTER TABLE tablename ALTER COLUMN Column den Paramter Scale verändern ? Ich habe schon ganz viel probiert, aber es will nicht gelingen. <br> Bitte um dringende Mithilfe. <br> Grüsse Holger

  • #2
    Hallo,

    genau für diesen Einsatzfall stellt Microsoft mit <b>ADOX</b> (ADO Extension for Data Definition Language and Security) ein zweites Objektmodell neben ADO zur Verfügung. Das folgende Beispiel demonstriert den prinzipiellen Einsatz - in der Hilfedatei des <i>Microsfot MDAC SDK</i>, des <i>Microsoft Platform SDK</i> oder auf den MSDN-Webseiten ist die sehr ausführliche Dokumentation aller verfügbaren Optionen zu finden.

    Um ADOX nutzen zu können, muss in Delphi einmalig die Typbibliothek <b>Microsoft ADO Ext. 2.x for DDL an Security</b> importiert und in die Uses-Auflistung als <i>ADOX_TLB</i> eingefügt werden:
    <pre>
    uses ADOX_TLB;

    resourcestring
    cCONNECTSTRING = 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=';

    procedure TFormMain.Button1Click(Sender: TObject);
    var
    aCatalog : _Catalog;
    aTable : _Table;
    aColumn : _Column;
    aIndex : _Index;
    sDBPath : String;
    sDS : String;
    vColName : OleVariant;
    begin
    MemoLog.Lines.Clear;
    sDBPath := EditMDB.Text;
    if FileExists(sDBPath) then
    begin
    DeleteFile(sDBPath);
    MemoLog.Lines.Add(Format('Datenbankdatei %s gelöscht',[sDBPath]));
    end;
    aCatalog := CoCatalog.Create;
    MemoLog.Lines.Add('Catalog...');
    sDS := aCatalog.Create(Format('%s%s',[cCONNECTSTRING, sDBPath]));
    MemoLog.Lines.Add(sDS);
    aTable := CoTable.Create;
    MemoLog.Lines.Add('Table...');
    aTable.ParentCatalog := aCatalog;
    aTable.Name := 'Kunden';

    // Spalte 1
    aColumn := CoColumn.Create;
    with aColumn do
    begin
    ParentCatalog := aCatalog;
    Name := 'KdnName';
    Type_ := adVarWChar;
    DefinedSize := 20;
    Properties['Description'].Value := 'Name des Kunden';
    Properties['Nullable'].Value := False;
    end;
    aTable.Columns.Append(aColumn, 0, 0);
    MemoLog.Lines.Add('Spalte 1 hinzugefügt...');

    // Spalte 2
    aColumn := CoColumn.Create;
    with aColumn do
    begin
    ParentCatalog := aCatalog;
    Name := 'Vorname';
    Type_ := adVarWChar;
    DefinedSize := 15;
    Properties['Description'].Value := 'Vorname des Kunden';
    Properties['Nullable'].Value := False;
    end;
    aTable.Columns.Append(aColumn, 0, 0);
    MemoLog.Lines.Add('Spalte 2 hinzugefügt...');

    // Spalte 3
    aColumn := CoColumn.Create;
    with aColumn do
    begin
    ParentCatalog := aCatalog;
    Name := 'eMail';
    Type_ := adVarWChar;
    DefinedSize := 20;
    Properties['Description'].Value := 'eMail-Adresse des Kunden';
    Properties['Default'].Value := '(unbekannt)';
    Properties['Jet OLEDB:Allow Zero Length'].Value := True;
    end;
    aTable.Columns.Append(aColumn, 0, 0);
    MemoLog.Lines.Add('Spalte 3 hinzugefügt...');

    // Spalte 4
    aColumn := CoColumn.Create;
    with aColumn do
    begin
    ParentCatalog := aCatalog;
    Name := 'Telefon';
    Type_ := adVarWChar;
    DefinedSize := 15;
    Properties['Description'].Value := 'Telefonnummer des Kunden';
    Properties['Nullable'].Value := True;
    end;
    aTable.Columns.Append(aColumn, 0, 0);
    MemoLog.Lines.Add('Spalte 2 hinzugefügt...');

    // Tabelle hinzufügen
    aCatalog.Tables.Append(aTable);
    MemoLog.Lines.Add('Tabelle hinzugefügt... ');

    // Primärschlüssel hinzufügen
    aIndex := CoIndex.Create;
    aIndex.Name := 'PKMix';
    vColName := 'KdnName';
    aColumn := aTable.Columns.Item[vColName] as _Column;
    aIndex.Columns.Append(aColumn.Name, aColumn.Type_, aColumn.DefinedSize);
    vColName := 'Vorname';
    aColumn := aTable.Columns.Item[vColName] as _Column;
    aIndex.Columns.Append(aColumn.Name, aColumn.Type_, aColumn.DefinedSize);
    aIndex.PrimaryKey := True;
    aIndex.Unique := True;
    aTable.Indexes.Append(aIndex, EmptyParam);
    MemoLog.Lines.Add('Index hinzugefügt... Fertig!');
    end;
    </pre&gt

    Comment


    • #3
      Hallo Andreas, <br>
      Danke für die (fast) erschöpfende Antwort... mit ist klar, wie ich mit ADOX neue Tabellen anlegen kann und so weiter... was mir nicht klar ist, bzw. was bei mir nicht geht ist das Ändern des Wertes "Scale". Es handelt sich eindeutig um ein "numeric" feld, trotzdem geht das nicht. Hat jemand ein Beispiel für die Veränderung von Feldeigenschaften, wenn die Tabelle schon besteht und auch schon mit "Leben" gefüllt ist ?<br>
      Gruss <br>
      Holge

      Comment


      • #4
        Hallo Holger,

        in der Hilfedatei aus dem Microsoft Platform SDK ist auf der Seite für <b>NumericScale Property</b> folgendes zu lesen:
        <pre><i>
        NumericScale Property
        Indicates the scale of a numeric value in the column.

        Settings and Return Values
        Sets and returns a Byte value that is the scale of data values in the column when the Type property is adNumeric or adDecimal. NumericScale is ignored for all other data types.

        Remarks
        The default value is zero (0).

        NumericScale <b>is read-only</b> for Column objects already appended to a collection.

        See Also
        NumericScale and Precision Properties Example (VB)

        Type Property (Column)
        Applies To: Column Object

        © 1998-2001 Microsoft Corporation. All rights reserved.</i>
        </pre>
        &gt;..wenn die Tabelle schon besteht und auch schon mit "Leben" gefüllt ist.

        In diesem Fall gehe ich davon aus, dass der Umweg über eine temporäre Hilfstabelle notwendig ist, in der die neue Struktur als neue Tabelle angelegt wird. Nach dem Umkopieren der bereits vorhandenen Daten wird die neue Tabelle zur alten erklärt

        Comment


        • #5
          Hallo Andreas, <br>
          danke für die Antwort, ich mache es jetzt tatsächlich so, dass ich die Tabellen neu erzeuge. <br>

          Vielen Dank<br
          Holge

          Comment

          Working...
          X