PDA

Ver la Versión Completa : Ejecución de un DTS de SQL Server 2000


grotero76
10-06-2008, 12:00:17
Hola a todos,

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

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í:
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:

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.