Announcement

Collapse
No announcement yet.

ADO und Exceltabellen

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

  • ADO und Exceltabellen

    Hallo,
    hab ein kleines Problem. Ich öffne mit der ADO eine Exceltabelle und lasse mir die Daten in einem DBGrid anzeigen. Nur fehlen bei einigen Feldern die entsprechenden Daten. Die ADO erkennt doch anhand des ersten Datensatzes um was für einen Feldtyp es sich bei jeder Spalte handelt (meinetwegen integer) und legt dementsprechend die Fields an. Taucht jetzt aber in derselben Spalte beim zweiten Datensatz ein String auf wird der Inhalt dieses Feldes ignoriert. Wie kann ich mir diese Daten nun doch anzeigen lassen?

    ciao Elerian

  • #2
    Hallo,

    wie sieht ein kleines Beispiel aus, mit dem dieses Projekte jederzeit reproduziert werden kann

    Comment


    • #3
      Hallo Herr Kosch,

      Also eigentlich ganz simpel: DBGrid mit Datasource und die mit einer ADODataset verbunden. In der ADO nutze ich eine DSN-Datei als Datenverknüpfungsdatei (über die Systemsteuerung erstellt). Diese greift auf eine Exceltabelle zu. Im CommandText steht: "select * from Dongles". Öffnen und so weiter funktioniert. In der Exceltabelle ist ein Spaltenkopf vorhanden mit den Spaltennamen und darunter die Werte.
      bei den Werten in einer Spalte handelt es sich zum einen um Zahlen (1) oder um einen kurzen String (1+1=2). Die ADO legt nun selbständig fest um was für Daten es sich in den einzelnen Spalten handelt und erzeugt die entsprechenden Felder dazu. Wenn in dem ersten Datensatz eine "1" in einer Spalte steht, dann werden die Werte die keine Zahlen sind in der selben Spalte in den folgenden Datensätzen einfach nicht angezeigt oder gelesen. Selbst dann nicht wenn man den Wert mit FieldByName('blabla').AsString versucht zu lesen. Erzeugt man nun persistente Stringfelder (zur Laufzeit) und versucht die Datenmenge zu öffnen wird das mit der Fehlermeldung "...String erwartet, Feld vom Typ Float gefunden" quittiert.
      Selbst wenn man in der Exceltabelle alle Felder als Textfelder formatiert.

      Wie kann ich aber nun trotzdem beide Feldtypen in ein und derselben Spalte auslesen?

      Dank

      Comment


      • #4
        Hallo,

        in diesem Fall muss in der Excel-Tabelle dafür gesorgt werden, dass die Zahlen als Text interpretiert werden. Wenn ich dort nicht nur den Wert <b>3</b> eintrage, sondern <b>'3</b> (mit vorangestelltem Hochkomma), zeigt Excel nur die 3 an, aber das Ganze wird als String interpretiert. Greift nun ADO auf diese EXCEL-Tabelle zu, wird eine TField-Instanz vom Typ TWideString verwendet, so dass alle Daten angezeigt werden:
        <pre>
        unit Unit1;

        interface

        uses
        Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
        Grids, DBGrids, Db, ADODB, StdCtrls;

        type
        TForm1 = class(TForm)
        ADOConnection1: TADOConnection;
        Button1: TButton;
        ADODataSet1: TADODataSet;
        DataSource1: TDataSource;
        DBGrid1: TDBGrid;
        ADODataSet1Spalte1: TWideStringField;
        ADODataSet1Spalte2: TFloatField;
        ADODataSet1Spalte3: TWideStringField;
        procedure Button1Click(Sender: TObject);
        private
        { Private-Deklarationen }
        public
        { Public-Deklarationen }
        end;

        var
        Form1: TForm1;

        implementation

        {$R *.DFM}

        procedure TForm1.Button1Click(Sender: TObject);
        begin
        ADODataSet1.Open;
        end;

        end.
        </pre>
        DFM-Datei:
        <pre>
        object Form1: TForm1
        Left = 192
        Top = 107
        Width = 696
        Height = 480
        Caption = 'Form1'
        Color = clBtnFace
        Font.Charset = DEFAULT_CHARSET
        Font.Color = clWindowText
        Font.Height = -11
        Font.Name = 'MS Sans Serif'
        Font.Style = []
        OldCreateOrder = False
        PixelsPerInch = 96
        TextHeight = 13
        object Button1: TButton
        Left = 80
        Top = 16
        Width = 75
        Height = 25
        Caption = 'Button1'
        TabOrder = 0
        OnClick = Button1Click
        end
        object DBGrid1: TDBGrid
        Left = 32
        Top = 80
        Width = 577
        Height = 281
        DataSource = DataSource1
        TabOrder = 1
        TitleFont.Charset = DEFAULT_CHARSET
        TitleFont.Color = clWindowText
        TitleFont.Height = -11
        TitleFont.Name = 'MS Sans Serif'
        TitleFont.Style = []
        end
        object ADOConnection1: TADOConnection
        ConnectionString =
        'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Ablage\XLSTabell' +
        'e.xls;Extended Properties=Excel 8.0;Persist Security Info=False'
        LoginPrompt = False
        Mode = cmShareDenyNone
        Provider = 'Microsoft.Jet.OLEDB.4.0'
        Left = 32
        Top = 16
        end
        object ADODataSet1: TADODataSet
        Connection = ADOConnection1
        CursorType = ctStatic
        CommandText = 'SELECT [Spalte 1], [Spalte 2], [Spalte 3] FROM XLSTbl'
        Parameters = <>
        Left = 32
        Top = 48
        object ADODataSet1Spalte1: TWideStringField
        FieldName = 'Spalte 1'
        Size = 255
        end
        object ADODataSet1Spalte2: TFloatField
        FieldName = 'Spalte 2'
        end
        object ADODataSet1Spalte3: TWideStringField
        FieldName = 'Spalte 3'
        Size = 255
        end
        end
        object DataSource1: TDataSource
        DataSet = ADODataSet1
        Left = 64
        Top = 48
        end
        end
        </pre>
        P.S: In einer Datenbanktabelle müssen alle Felder einer Spalte vom gleichen Datentyp sein. Da Excel keine Datenbank im eigentlichen Sinn ist, darf man dort diese Regel ungestraft verletzen. Allerdings verhält sich ADO ganz regelkonform, so dass alle "Verstöße" nicht angezeigt werden.

        &#10

        Comment


        • #5
          Danke

          Comment

          Working...
          X