Announcement

Collapse
No announcement yet.

Pendant zu BatchMove für ADO ?

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

  • Pendant zu BatchMove für ADO ?

    gibt es sowas bzw. wie kann man Daten von einer ADO-Connection zur anderen
    unter Angabe des Mappings (DestFeldName = SourceFeldName) kopieren ?

    Source ADO-ORACLE-Conn : ok !
    Dest. ADO-mySQL-Conn : ok ! (Dank an Falk Prüfer !)

    Batchmove geht mit ADO nicht : Compilefehler..
    und jetzt ? :-|

    MfG
    Wolf

  • #2
    Hallo,

    normalerweise ist das eine Aufgabe der Datenbank. Wenn der Microsoft SQL Server 2000 eingesetzt würde, könnte man zum Beispiel auf die Funktion OPENROWSET zugreifen, um die Daten aus einer Excel-Tabelle direkt in die MS SQL Server-Datenbank einzulesen:
    <pre>
    USE tempdb
    GO

    SELECT CAST(PersNo AS INT) AS PersNo, Nachname, Vorname INTO ExcelImport
    FROM OPENROWSET('MSDASQL',
    'Driver=Microsoft Excel-Treiber (*.xls);DBQ=C:\EXCEL2002.xls',
    'SELECT * FROM [Personal$]')
    GO
    </pre>
    Wenn das die verwendete Datenbank (mySQL) nicht kann, muss man als zweites auf die Fähigkeiten des OLE DB Providers zugreifen. Im Fall der Microsoft Jet Engine kann diese viele Fremdformate (dBASE, Paradox, XLS, XML, CSV, HTML usw.) lesen und schreiben:
    <pre>
    procedure TForm1.ButtonExportClick(Sender: TObject);
    resourcestring
    cSQL1 = 'SELECT * INTO [Export.%s] IN "C:\Temp" "%s;" FROM Customer';
    cSQL2 = 'SELECT * INTO %s IN "C:\Temp\%s" "Excel 8.0;" FROM Customer';
    cSQL3 = 'SELECT * INTO [%s] IN "C:\Temp\%s" FROM Customer';
    var
    sSQL : String;
    iRows: Integer;
    begin
    case RadioGroupExport.ItemIndex of
    0 : sSQL := Format(cSQL1, ['dbf', 'dBASE 5.0']);
    1 : sSQL := Format(cSQL1, ['db', 'Paradox 5.x']);
    2 : sSQL := Format(cSQL1, ['htm', 'HTML Export']);
    3 : sSQL := Format(cSQL1, ['txt', 'Text']);
    4 : sSQL := Format(cSQL2, ['Tabelle1', 'Export.xls']);
    5 : sSQL := Format(cSQL3, ['Cust', 'Test1.MDB']);
    end;
    StatusBar1.Panels[0].Text := sSQL;
    ADOConnection1.Connected := True;
    ADOConnection1.Execute(sSQL, iRows);
    ADOConnection1.Connected := False;
    StatusBar1.Panels[1].Text := IntToStr(iRows);
    ShowMessage(Format('Es wurden %d Datensätze exportiert.', [iRows]));
    end;
    </pre>
    Wenn der verwendete OLE DB Provider für die verwendete Datenbank das auch nicht kann, muss man das im eigenen Programm selbst in die Hand nehmen. Da ADO auf die Fähigkeiten des OLE DB Providers angewiesen ist, kann es keine universell passende ADO-Methode geben. Denn auch TBatchMove ist speziell für die BDE zugeschnitten und unterstützt somit nur die Datenbanken, für die die BDE einen Treiberweg findet

    Comment


    • #3
      danke für antwort , herr kosch !

      also ist das nicht falsch, daß ich mit einer eigenen Routine
      feldweise Daten schaufele (ORACLE->mySQL), die ich als
      ordentlicher Programmierer soweit möglich verallgemeinere;
      dabei fällt mir was in Richtung Progressbar (geht in BatchMove nicht(?)) ein :-))

      so siehts derzeit aus:
      <pre>
      procedure TForm1.copy_bereich();
      var sSQL, dSQL : String;
      k_arr : array of Variant;
      buffer : Variant;
      i : Integer;
      begin

      //- mit ADOQuery Kopierversuch..so ungefähr
      sSQL := 'SELECT * FROM u_eal1.bereich';
      dSQL := 'INSERT INTO a_bereich (bereich,bezeichnung,lupdate,luser)'+
      ' VALUES ( Bereich,Bezeichnung,Lupdate,Luser)';
      ADOQryUniversal.SQL.Add(sSQL);
      ADOCommand1.CommandText := dSQL;

      With ADOQryUniversal do
      begin
      //- Leseschleife
      Open;
      First;
      //- Leseschleife
      //SetLength(k_arr, Fields.Count);
      //set_progress(PB_MAX, Fields.Count);
      While Not Eof do
      begin

      For i:= 0 To Fields.Count -1 do
      begin
      //k_arr[i] := Fields.FieldByNumber[i].AsInteger;
      buffer := Fields.FieldByNumber[i].AsInteger;
      //ADOCommand1.Parameters[i].Value := k_arr[i];
      ADOCommand1.Parameters[i].Value := buffer;
      //set_progress(PB_SHOW, i);
      Next;
      end;
      // Insert ausführen
      ADOCommand1.Execute;
      Next;
      end;
      end;
      end;
      </pre>
      fehlt natürlich noch try,..except.. usw.

      MfG
      Wol

      Comment


      • #4
        also, mit ADO geht das schon besser,
        aber bei Delphi5 ist die Doku miserabel ,
        "Borland Delphi 5" von W.Doberenz (Hanser Verlag)ist zu
        diesem Thema eher oberflächlich ..
        <pre>
        wo find ich
        a) in Bezuf auf Delphi <=5
        b) allgemein zu ADO-Treibern
        vollständige und verständliche Infos und Beispiele
        z.B. "ADO für Dummies.." :-))
        </pre>

        Mfg
        Wol

        Comment


        • #5
          Hallo

          ich versuch das gerade mit einen XML Dokument, aber ich finde keine Doku ( die ich auch verstehe :-) ) Da ein XML hierachrchisch aufgebaut ist muß mann doch die Daten in verschiedene Tabellen eintragen ( relational).
          Hat da schon jemand Erfahrungen

          Comment

          Working...
          X