Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Ejecución de un DTS de SQL Server 2000 (https://www.clubdelphi.com/foros/showthread.php?t=57261)

grotero76 10-06-2008 12:00:17

Ejecución de un DTS de SQL Server 2000
 
Hola a todos,

he encontrado el siguiente código para ejecutar un DTS de Sql Server 2000 desde desphi:

Código:

procedure TForm1.Button2Click(Sender: TObject);
var
  oPackage:TPackage;
  vHost: OleVariant;
begin
  try
    // inicializar
    CoInitialize(nil);
    //Crear el objeto
    oPackage:=TPackage.Create(nil);
    // Cagarlo
    oPackage.LoadFromSQLServer(
      Edit1.Text,    // Servidor
      Edit2.Text,    // Usuario
      Edit3.Text,    // Contraseña
      256,'', '', '',
      Edit4.Text,    // Nombre del DTS
      vHost);
    // ejecutar
    oPackage.UnInitialize;
    oPackage.Execute;
    MessageDlg('Ejecución correcta.', mtInformation, [mbOK], 0);
  except
    raise;
  end;
end;

El caso es que yo le paso el servidor, usuario, contraseña y nombre del DTS correctos pero al ejecutar este código no hace nada, aunque tampoco da ningún error. ¿Alguien puede decirme si hay algo que esté haciendo mal?

Otra forma de ejecutar el DTS es usando la función de DOS WINEXEC. Así:
Código:

  if (winexec(PChar('dtsrun /S '+datasource+' /U '+usuario+' /P '+password+' /N '+dtrName),SW_HIDE)<31)
    then ShowMessage('Hubo un error en la llamada al dts.');

Esto se ejecuta y funciona sin ningún problema, pero no me sirve ya que si se produce algún error al ejecutar el DTS, como por ejemplo que el DTS no exista se produce el error y se ve en la ventana de DOS pero no sé como controlar la excepción para indicar desde Delphi que se produjo un error, es decir, el mensaje que pongo en ShowMessage no se ve nunca, aunque el DTS no haya podido ejecutarse.

Espero que me podáis ayudar, pues llevo dando vueltas a esto bastante tiempo.

Un saludo y muchas gracias.

grotero76 11-06-2008 08:20:20

Por si a alguien le sirve he encontrado un método que funciona perfectamente, os lo pongo:

Código:

procedure SincronizarBD;
var
  pkg: Variant;
  i:integer;
begin
  pkg:= CreateOleObject('DTS.Package');
  try
    pkg.LoadFromSQLServer(datasourceName,UserName,Password,,,,,dtsName),'');
    for i := 1 to pkg.steps.count do
      pkg.steps.Item(i).executeinMainThread := True;
    pkg.FailOnError := true;
    pkg.Execute;
    MessageDlg('La sincronización se ha realizado correctamente',mtInformation,[mbOK],0);
  except
  on E: Exception do
  begin
    showmessage('Error = ' + E.Message);
    exit;
  end;
end;
pkg.uninitialize;
pkg:=UnAssigned;
end;


Un saludo.


La franja horaria es GMT +2. Ahora son las 17:31:20.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi