Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi BatchMove für dbExpress und/oder ADO (https://www.delphipraxis.net/11041-batchmove-fuer-dbexpress-und-oder-ado.html)

r_kerber 30. Okt 2003 10:03


BatchMove für dbExpress und/oder ADO
 
Hallo allerseits,

für die "gute alte" BDE gab's doch 'ne Kompoenente TBatchMove. Bei dbExpress gibt es etwas derartiges nichtInternals of dbExpress:
Zitat:

Among the other differences from the BDE, dbExpress has no concept of live queries, cached updates, schema creation support, heterogeneous query processing, batchmove, and so on.
OK, ich könnte jetzt datensatzweise die Tabelle von A nach B kopieren. Schöner wäre natürlich eine ähnliche Komponente. Ob dbExpress oder ADO ist mir zunächst erst mal egal. Hat vielleicht jemand mal 'nen Tip?

r_kerber 23. Dez 2003 13:39

Re: BatchMove für dbExpress und/oder ADO
 
Hallo,

ich hole den Beitrag mal nach vorn, da ich jetzt tatsächlich so eine Komponente oder eine Anregung (für ADO-ODBC-Verbindungen), wie ich dies bei Tabellen/Queries mit sehr vielen Spalten auch ohne viel Code-Zeilen realisieren kann. Die Quell- und Ziel-Tabellen befinden sich in verschiedenen Datenbanken (hier Informix). Und die DB's wiederum können auf unterschiedlichen (UNIX-)Rechnern liegen. Aus den Quell-Tabellen sollen auch nur bestimmte Datensätze kopiert werden.

MrSpock 23. Dez 2003 16:15

Re: BatchMove für dbExpress und/oder ADO
 
Hallo Rainer,

möglicherweise hilft dir diese Info zu dbExpressPlus. Unter diesem Stichwort findest du einiges Bei Google suchendbExpressPlus. Dort wird die DataPump angeboten, die BatchMove ersetzen soll. Ich habe sie einmal für ASCII Export benutzt. Wie gut sie sonst ist, kann ich nicht sagen.

r_kerber 23. Dez 2003 17:28

Re: BatchMove für dbExpress und/oder ADO
 
Hallo Spocky,

vielen Dank für den Tip. Ich könnte aber jetzt eher etwas für ADO gebrauchen. Aber wenn's gar nicht anders geht, muß ich eben die ADO durch die DBExpress-Kompos ersetzen. Habe ja heute erst mit dem kleinen Tool angefangen.

r_kerber 30. Dez 2003 08:07

Re: BatchMove für dbExpress und/oder ADO
 
Ich habe das jetzt durch zwei eigene Methoden im DataModul gelöst. Für jeden Datensatz einer Antwortdatenmenge der Quell-DB wird ein INSERT-Statement generiert, welches auf der Ziel-DB ausgeführt wird:
Delphi-Quellcode:
{**
      Kopieren von selektierten Datensätzen aus einer Datenbank
      in eine gleich aufgebaute Datenbank-Tabelle.

      Die selektierten Datensätze werden in einem
      TBetterADODataSet dargestellt.

      @param   sTableName     Name der Datenbank-Tabelle
      @param   ds_Source      Dataset mit selektierten Datensätzen
      @return
      @see                     CreateInsertSQL
}
procedure TdmCopyVertrag.CopyTable(sTableName: String;
  ds_Source: TBetterADODataSet);
begin
  ds_Source.Open;
  ds_Source.First;

{
  Für jeden Datensatz des Result-Sets wird ein INSERT-Statement erzeugt und
  auf die Ziel-Tabelle ausgeführt.
}
  while not ds_Source.Eof do
  begin
    qu_Dest.SQL.Clear;
    qu_Dest.SQL.Add (CreateInsertSQL(sTableName, ds_Source));
    qu_Dest.ExecSQL;
    ds_Source.Next;
  end; //  while not ds_Source.Eof do
  ds_Source.Close;
end; //  CopyTable

{**
      Erstellen eines Insert-Statements für den aktuellen Datensatz
      der Quell-Tabelle.

      @param   sTableName     Name der Datenbank-Tabelle
      @param   ds_Source      Dataset mit selektierten Datensätzen
      @return                  Insert-Statement
      @see                     CopyTable
}
function TdmCopyVertrag.CreateInsertSQL(sTableName: String;
                                        ds_Source: TBetterADODataSet
                                        ): String;
var
  sFields, sValues: String;
  i: Integer;
  DefaultLCID: Integer;
begin

{
  Dezimal-Trennzeichen in SQL-Statement muß ein Punkt sein!
}
  DecimalSeparator := '.';
  ThousandSeparator := ',';
  sValues := ' VALUES(';
  sFields := '(';
  for i := 0 to ds_Source.FieldCount - 1 do
  begin
    if ds_Source.Fields[i].IsNull then
      sValues := sValues + 'NULL'
    else
    begin

{
  Zeichenketten müssen von '' begrenzt werden. Bei Informix muß zusätzlich
  die Funktion Date() verwendet werden.

  Gegebenenfalls können hier Besonderheiten weiterer Datentypen abgehandelt
  werden
}
      case ds_Source.Fields[i].DataType of
        ftString: begin
                    sValues := sValues +
                       QuotedStr(ds_Source.Fields[i].AsString);
                  end; //  ftString
        ftDate:  begin
                    sValues := sValues +  'Date(' +
                       QuotedStr(ds_Source.Fields[i].AsString)+ ')';
                  end; //  ftDate
        else     begin
                    sValues := sValues + ds_Source.Fields[i].AsString;
                  end; //  else
      end; //  case ds_Source.Fields[i].DataType of
    end; //  if ds_Source.Fields[i].IsNull else
   
    sFields := sFields + ds_Source.Fields[i].FieldName;

{
  Values und Feldnamen werden durch Komma getrennt. Nach dem letzten Wert bzw.
  Feldnamen hingegen steht eine runde schließende Klammer!
}
    if i = ds_Source.FieldCount - 1 then
    begin
      sValues := sValues + ')';
      sFields := sFields + ')';
    end //  if i = ds_Source.FieldCount - 1 then
    else
    begin
      sValues := sValues + ', ';
      sFields := sFields + ', ';
    end; // if i = ds_Source.FieldCount - 1 else
  end; // for i := 0 to ds_Source.FieldCount - 1 do

  Result := 'INSERT INTO ' + sTableName + sFields + sValues;

{
  Rücksetzen auf Standard-Werte für den jeweiligen PC
}
  DefaultLCID := GetThreadLocale;
  DecimalSeparator := GetLocaleChar(DefaultLCID, LOCALE_SDECIMAL, '.');
  ThousandSeparator := GetLocaleChar(DefaultLCID, LOCALE_STHOUSAND, ',');
end; //  CreateInsertSQL


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:43 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz