AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi BatchMove für dbExpress und/oder ADO

BatchMove für dbExpress und/oder ADO

Ein Thema von r_kerber · begonnen am 30. Okt 2003 · letzter Beitrag vom 30. Dez 2003
Antwort Antwort
Benutzerbild von r_kerber
r_kerber

Registriert seit: 11. Feb 2003
Ort: Trittau
3.538 Beiträge
 
Delphi XE Professional
 
#1

BatchMove für dbExpress und/oder ADO

  Alt 30. Okt 2003, 11:03
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?
  Mit Zitat antworten Zitat
Benutzerbild von r_kerber
r_kerber

Registriert seit: 11. Feb 2003
Ort: Trittau
3.538 Beiträge
 
Delphi XE Professional
 
#2

Re: BatchMove für dbExpress und/oder ADO

  Alt 23. Dez 2003, 14:39
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.
  Mit Zitat antworten Zitat
Benutzerbild von MrSpock
MrSpock
(Co-Admin)

Registriert seit: 7. Jun 2002
Ort: Owingen
5.865 Beiträge
 
Delphi 2010 Professional
 
#3

Re: BatchMove für dbExpress und/oder ADO

  Alt 23. Dez 2003, 17:15
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.
Albert
Live long and prosper


MrSpock
  Mit Zitat antworten Zitat
Benutzerbild von r_kerber
r_kerber

Registriert seit: 11. Feb 2003
Ort: Trittau
3.538 Beiträge
 
Delphi XE Professional
 
#4

Re: BatchMove für dbExpress und/oder ADO

  Alt 23. Dez 2003, 18:28
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.
  Mit Zitat antworten Zitat
Benutzerbild von r_kerber
r_kerber

Registriert seit: 11. Feb 2003
Ort: Trittau
3.538 Beiträge
 
Delphi XE Professional
 
#5

Re: BatchMove für dbExpress und/oder ADO

  Alt 30. Dez 2003, 09:07
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
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:58 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