Einzelnen Beitrag anzeigen

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, 08: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