Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   MS SQL Server (https://www.clubdelphi.com/foros/forumdisplay.php?f=23)
-   -   Respaldo y recuperacion (https://www.clubdelphi.com/foros/showthread.php?t=54699)

flor 27-03-2008 20:22:28

Respaldo y recuperacion
 
hola necesito hacer el respaldo y la recuperacion desde una aplicacion en delphi la base de datos esta en sql server 2005 , si alguien pudiera ayudarme se los agradeceria mucho. :confused:

jcarteagaf 27-03-2008 21:55:12

Backup y Restore en SQL Server
 
Para hacer Backup usa un componente TQuery (BDE) o TADOQuery (ADO) con el siguiente comando SQL:

Código SQL [-]
BACKUP DATABASE Nombre_Base_de_Datos
TO
  DISK =
 Archivo_de_Backup
WITH
  NOFORMAT,
  NOINIT,
  NAME = Nombre_Backup,
  NOREWIND,
  NOUNLOAD,
  NOSKIP


Y para hacer el Restore usa lo siguiente:

Código SQL [-]
RESTORE DATABASE Nombre_Base_de_Datos
FROM
  DISK =
Archivo_de_Backup
WITH
  FILE = 1,
  NOREWIND,
  NOUNLOAD,
  REPLACE

Donde
Nombre_Base_de_Datos= Nombre de tu base de datos
Archivo_de_Backup= Nombre del archivo en el que generaras el backup

Funcionara para SQL 7 o superior

Espero que te sirva.
Saludos

flor 31-03-2008 19:10:06

error aplicando backup
 
hola gracias por la informacion investigue sobre esas sentencias y trate de aplicarlas pero me marca este error (ADOQuery2:CommandText does not return a result set) me podrias ayudar a identificar que estoy haciendo mal, muchas gracias.:confused:

jcarteagaf 31-03-2008 23:03:18

Command Text does not.....
 
El error que te marca es porque tu estas ejecutando el Metodo Open ,para que te funcione debes usar el ExecSql:

Código Delphi [-]
Adoquery2.ExecSql;

Saludos

KELVIN RC 02-04-2008 17:41:32

:eek::eek:a jcarteagaf yo trabajo con delphi 6 enterprise, wxp sp2 y ms sql server 2000 prodias ayudarme aclarandome un poco mas detallado la forma de como hacer el backup y restore a la bd,:):) me conecto a la bd atraves de un TADOConnection:):)

jcarteagaf 02-04-2008 20:09:57

Aclarando la Figura
 
Hola, KELVIN RC si quieres usar el anterior ejemplo tienes que colocar un TADOQuery en tu aplicacion y colocarle el query que detallo a continuacion:

Código SQL [-]
BACKUP DATABASE
Nombre_Base_de_Datos
TO
  DISK =
Archivo_de_Backup
WITH
  NOFORMAT,
  NOINIT,
  NAME =
Nombre_Backup
,
  NOREWIND,
  NOUNLOAD,
  NOSKIP

Luego cambiar las lineas 1, 4 y 9 por los valores que tu desees. Puedes hacerlo en tiempo de diseño (los valores serian fijos) o en tiempo de ejecucion con instrucciones parecidos a los siguientes:

Código Delphi [-]
Adoquery1.sql[1] := Edit1.text; // en Edit1 tienes el nombre de la Base
Adoquery1.sql[4] := Edit2.text; // en Edit2 el nombre del archivo que quieres generar (incluido el path).
Adoquery1.sql[9] := Edit3.text; // Como se llamara el backup. puede tener el mismo nombre de la base
Adoquery1.Execsql;

La unica condicion es que la ruta del archivo donde generas el backup este en el mismo servidor que el SQL Server.
Lo mismo haces con el restore, pero para este ultimo la condición es la base de datos no este siendo utilizada. Espero que haber clarificado tus dudas.

Saludos

KELVIN RC 02-04-2008 21:06:40

mas PREGUNTAS
 
ESTE CODIGO LO COLOCO EN LA PROPIEDAD SQL DEL ADOQUERY
BACKUP DATABASE
PRESTAMOS
TO
DISK = E:\KELVIN
WITH
NOFORMAT,
NOINIT,
NAME = PRESTAMO,
NOREWIND,
NOUNLOAD,
NOSKIP

CUANDO INTENTO ACTIVARLO ME DA EL SIGUIENTE ERROR
OBJETO PÀRAMETER MAL DEFINIDO SE PROPORCIONO INFORMACION INCORRECTA O INCUERENTE

LO EJECUTO DE LA SIGUIENTE MANERA EN EL SQL QUERY ANALYZER

BACKUP DATABASE
PRESTAMOS/*ES EL NOMBRE DE LA BASE DE DATOS*/
TO
DISK = 'E:\KELVIN'/*ES LA RUTA DONDE QUIERO GUARDAR EL ARCHIVO*/
WITH
NOFORMAT,
NOINIT,
NAME = 'PRESTAMO_Backup',/*AQUI NO SE K PONER Y LO DEJE = */
NOREWIND,
NOUNLOAD,
NOSKIP
Y AKI ME FUNCIONA

GRACIAS POR TU ATENCION

jcarteagaf 02-04-2008 22:35:00

Backup y restore
 
El error que te muestra es debido a que estas usando el archivo destino sin comillas en tu ejemplo dice:

E:\KELVIN

y deberia decir

'E:\KELVIN'

En el ejemplo que te di no tome en cuenta eso, para enviarlo con comillas usa lo siguiente:

Código Delphi [-]
Adoquery1.sql[4] := QuotedStr(Edit2.text);

Saludos.

KELVIN RC 03-04-2008 20:31:03

mas PREGUNTAS
 
Con Eso Se Resolvio El Problema Solo Hacian Falta Las Comillas Pero Ahora,
El Archivo Generado En E:\kelvin Se Aumenta Sin Cambiar Nada En El Sistema, Ose Sin Hacer Ninguna Entrada O Transaccion Si Se Realiza 2 Veces El Backup Se Aumenta,
Sabes A Que Se Deve Esto Y Como Resoberlo

Gracias Por Tu Tiempo

jcarteagaf 03-04-2008 21:17:09

Backup y Restore
 
Si, SQL crea "versiones" del backup sobre el mismo archivo.

Lo puedes hacer es controlar en tu aplicación si el archivo existe y eliminarlo antes de hacer el backup:

Código Delphi [-]
if FileExists(NombredelArchivo) then
  DeleteFile(NombreDelArchivo)
.....
Ejecutar Backup
Saludos.

KELVIN RC 03-04-2008 21:34:24

Preguntas
 
GRACIAS CON ESO SE RESOLBIO
PERO HAY QUE ARRECLAR ALGO QUE ES
if FileExists(NombredelArchivo)/* AQUI EL NOMBRE DEL ARCHIVO VA DENTRO DE COMILLAS*/ then DeleteFile(NombreDelArchivo)/* IGUAL AQUI CON SU RUTA CLARO*/.....Ejecutar Backup GRACIAS DE NUEVO

KELVIN RC 03-04-2008 22:44:38

mas preguntas
 
:confused::confused: ya se realiza a las mil maneras, pero prodrias ayudarme a ponerle una barra de progreso para que se vea un poco mas profecional

gracias de nuevo

jcarteagaf 04-04-2008 12:22:17

Barra de progreso
 
Lastimosamente no hay forma de colocar una barra de progreso para indicar al
usuario como va la cosa.

Pero puedes usar el componente JVWaitingGradient de los componentes Jedi que indica que se esta haciendo un proceso.

Tambien vi un componente parecido al control que usa el Management Studio del SQL 2005 (una rueda que va cambiando de color) en los componentes TMS.

Saludos

santi33a 04-04-2008 14:31:59

Yo para la salva cree un Procedimineto almacenado y lo llamo desde Delphi y me funciona bien, yo uso MSSQL Server 2000:

Código SQL [-]
CREATE PROCEDURE BACKUP_BD AS
SET LANGUAGE spanish
DECLARE  @BACKUP VARCHAR(60)
DECLARE  @DIRECTORIO CHAR(20)
DECLARE  @NOMBRE CHAR(60)
SET @DIRECTORIO = 'd:\'
SELECT @nombre = 'DB '+
 CASE Convert(char(1),datepart(dw,getdate()))
  when 1 then 'Lunes'
  when 2 then 'Martes'
  when 3 then 'Miercoles'
  when 4 then 'Jueves'
  when 5 then 'Viernes'
  when 6 then 'Sabado'
  when 7 then 'Domingo'
 end + ' '+
 Convert(char(2),DATEPART(dd,getdate()))+
 ' '+ 'de '+
 case Convert(char(2),datepart(MM,getdate()))
   when  01 then 'Ene'
   when  02 then 'Feb'
   when  03 then 'Mar'
   when  04 then 'Abr'
   when  05 then 'May'
   when  06 then 'Jun'
   when  07 then 'Jul'
   when  08 then 'Ago'
   when  09 then 'Sep'
   when  10 then 'Oct'
   when  11 then 'Nov'
   when  12 then 'Dic'
 End +' '+'del '+
 convert(char(4),datepart(yyyy,getdate()))+'.BAK' 
set @backup = rtrim(@directorio)+rtrim(@nombre)
checkpoint

BACKUP DATABASE RRHH to disk = @backup  with init
BACKUP LOG RRHH TO disk = @backup 

DBCC SHRINKFILE (RRHH_Log, 100)

para restaurar nunca lo pude hacer de Delphi, siempre me dice que la BD esta en uso y no le encontré solución por lo que cuando lo necesito lo hago desde el Interprise Maneger del MSSQL

KELVIN RC 04-04-2008 15:16:42

gracias
 
gracias santi33a pero soy nuevoen esto y no entiendo mucho lo que me esplicas, y los componentes jedy los buscare y tratare de hacerlo funcional, si saben donde encontrarlos se los agradeceria:):)

flor 17-04-2008 08:55:28

sigo con el error
 
hola ya puse el Adoquery2.ExecSQL; y aun me sale el mismo error cuando intento ejecutar la sentencia de sql del adoquery. el codigo que puse es el siguente:

procedure TForm2.Button2Click(Sender: TObject);
begin


ADOQuery2.Active:=true;
Adoquery2.ExecSQL;

end;

En la propiedad SQL del adoquery2 puse:

BACKUP DATABASE [JOY] TO DISK = C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\BACKUP\JOY.BAK' WITH NOFORMAT, NOINIT, NAME = JOY-Full Database Backup', SKIP, NOREWIND, NOUNLOAD, STATS = 10

y el error es:

ADOQuery2: CommandText does not return a result set

necesito ayuda...:confused:


jcarteagaf 17-04-2008 13:04:04

SQL Server
 
El problema esta en llamar a Active

Código Delphi [-]
procedure TForm2.Button2Click(Sender: TObject);
begin

ADOQuery2.Active:=true;
Adoquery2.ExecSQL;
end;

Solo deberias llamara Execsql

Código Delphi [-]
procedure TForm2.Button2Click(Sender: TObject);
begin
Adoquery2.ExecSQL;
end;

Utilizas Active := true u Open para abrir datasets que devuelvan un conjunto de datos, en cambio execsql ejecuta las instrucciones sql, que no necesariamente devolveran datos a la aplicación.

Saludos.

Lepe 17-04-2008 14:23:57

Dicho de otra forma:

Cuando el SQL es de seleccion (un SELECT *) se usa Active:= true (o bien adoquery1.Open que es lo mismo)

Cuando el SQL es de acción ( UPDATE, DELETE, ALTER TABLE, BACKUP) se usa ExecSql.

bye

jcarteagaf 17-04-2008 15:43:32

Open vs Execsql
 
Cita:

Empezado por Lepe (Mensaje 280714)
Dicho de otra forma:

Cuando el SQL es de seleccion (un SELECT *) se usa Active:= true (o bien adoquery1.Open que es lo mismo)

Cuando el SQL es de acción ( UPDATE, DELETE, ALTER TABLE, BACKUP) se usa ExecSql.

bye

Como diria el Chavo del Ocho

Eso, eso, eso, eso......:)


La franja horaria es GMT +2. Ahora son las 06:24:48.

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