Delphi-PRAXiS
Seite 1 von 2  1 2   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi MSSQL DB Restore Problem (https://www.delphipraxis.net/203108-mssql-db-restore-problem.html)

Pet04 14. Jan 2020 11:00

Datenbank: MSSQL • Version: 2017 • Zugriff über: Ado

MSSQL DB Restore Problem
 
Hallo Zusammen,

Ich habe folgenden Problem.
Ich möchte eine Datenbank (Backupdatei .bak Datei) von einem SQL Server 2008 R2 Express nach SQL 2017 Express einspielen.

Dabei muss ich nun mit move den Pfade für den 2017er Server Ordner angeben.

Dabei scheitere ich momentan an die Syntax.

Mein alter Code, ohne Pfadangebe "MOVE TO" :

Code:
  ...
          with ADOQ1 do
          begin
         
            ProgressBar2.Position := 50;
            SQL.clear;
            SQL.Text := 'restore database :DBName from '
                        +'Disk = :BakPfadName ';              
            Parameters.ParamByName('BakPfadName').Value := sTemp;
            Parameters.ParamByName('DBName').Value := sDBName;
            ExecSQL();
          end; (*with*)
          …


Über das MM Studio funktioniert es:

Code:
RESTORE DATABASE [db_Name] FILE = N'db_Name' FROM DISK = N'E:\Pfad des Backups\db_Name.bak' WITH FILE = 1, MOVE N'db_Name' TO N'C:\Program Files\Microsoft SQL Server\MSSQL14.SQLEXPRESS\MSSQL\DATA\db_Name.mdf', MOVE N'db_Name_log' TO N'C:\Program Files\Microsoft SQL Server\MSSQL14.SQLEXPRESS\MSSQL\DATA\db_Name.LDF', NOUNLOAD, REPLACE
Wie muss die Syntax aussehen, dass ich die Pfade, MDF und LDF als Variable / Parameter übergeben kann ?

Beispielcode wäre schön.


Vielen Dank.

jobo 14. Jan 2020 11:22

AW: MSSQL DB Restore Problem
 
Na offensichtlich so, wenn das funktioniert?!
das Statement unten ist jedenfalls etwas 'ausführlicher' formuliert, behandelt mögliche widechar Zeichen, liefert zusätzliche Option (die aber vielleicht default sind. usw. usw.

Wieso verwendest Du das nicht so, wenn es funktioniert?

Zitat:

Zitat von Pet04 (Beitrag 1455118)


Über das MM Studio funktioniert es:

Code:
RESTORE DATABASE [db_Name] FILE = N'db_Name' FROM DISK = N'E:\Pfad des Backups\db_Name.bak' WITH FILE = 1, MOVE N'db_Name' TO N'C:\Program Files\Microsoft SQL Server\MSSQL14.SQLEXPRESS\MSSQL\DATA\db_Name.mdf', MOVE N'db_Name_log' TO N'C:\Program Files\Microsoft SQL Server\MSSQL14.SQLEXPRESS\MSSQL\DATA\db_Name.LDF', NOUNLOAD, REPLACE


Pet04 14. Jan 2020 11:27

AW: MSSQL DB Restore Problem
 
weil nicht immer das MM Studio auf den PC's ist und ich es gerne mit Delphi lösen will.
Ich habe ein kleines DB-Tool welches meine DB erstellt, sichert und wiederherstellt.
Der DB Name ändert sich auch.

p80286 14. Jan 2020 12:07

AW: MSSQL DB Restore Problem
 
Darum geht es nicht, sondern um die Formulierung de Statements, das im MMStudio etwas ausführlicher scheint. Mal abgesehen von der eckigen Klammer um den DBNamen.

Gruß
K-H

jobo 14. Jan 2020 12:40

AW: MSSQL DB Restore Problem
 
Das funktionierende Statement müsstest du 1:1 in Deinen Code übernehmen können. - zur Probe
Dann / dort sollte es ebenfalls funktionieren. In der Umgebung, aus der das MM Studio Statement stammt.

Dann muss natürlich die Parameterierung angepasst werden, damit es wieder dynamisch ist.

Ich weiß nicht was ich übersehe oder ob es Dir nicht klar ist. p80286 hat es auch geschrieben.

Was Du aus MM Studio gezeigt hast, ist SQL und SQL führst Du auch in Deinem Client aus.
Wie die Parameter richtig zu befüllen sind (Verzeichnis, Pfadnamen, .. und wie Du sie dynamisch bestimmst, musst Du allerdings selbst wissen.

Analogie:
wenn Du MM Studio hast und damit eine Tabelle abfragst, funktioniert es natürlich. Funktioniert es in Deinem Programm dann nicht, wenn kein MM Studio da ist? Nein, Du kannst die gleiche Abfrage einer Tabelle auch in Deinem Programm laufen lassen.

Ach so: mir fällt gerade ein, dass Du unter MM Studio vielleicht einen anderen User verwendest. Backup / Restore ist ja etwas administratives und der SQL(?) User, den Du im Client verwendest hat dazu vielleicht nicht die Rechte.

Pet04 14. Jan 2020 13:30

AW: MSSQL DB Restore Problem
 
der erste Code funktioniert ja.
Nun möchte ich ihn mit den Parametern erweitern, woran ich momentan schreitere.

dbPath2 ist die Pfadangabe vom SQL Server 2017

Code:
 with ADOQ1 do
          begin
            dbPath2 := dbPath +sDBName+'.mdf';
            log := dbPath +sDBName+'_log.ldf';
         
            ProgressBar2.Position := 50;
            SQL.clear;        
            SQL.Text := 'restore database :DBName from '
                    //    +'Disk = :BakPfadName with Replace';
                          +'Disk = :BakPfadName WITH FILE = 1, Replace, MOVE :DBName TO :dbPath2, MOVE :logfile TO :log  ';
            Parameters.ParamByName('BakPfadName').Value := sTemp;
            Parameters.ParamByName('DBName').Value := sDBName;
            Parameters.ParamByName('dbPath2').Value := dbPath2;
            Parameters.ParamByName('logfile').Value := sDBName+'_log';
             Parameters.ParamByName('log').Value := log;
            ExecSQL();
Ich glaube, dass hier der Fehler bzw. die Syntax falsch ist.
Code:
 
SQL.Text := 'restore database :DBName from '                  
            +'Disk = :BakPfadName WITH FILE = 1, Replace, MOVE :DBName TO :dbPath2, MOVE :logfile TO :log  ';

jobo 14. Jan 2020 14:18

AW: MSSQL DB Restore Problem
 
Tja, wie gesagt, Die Kopie Deines Statements oben sollte ja wohl funktionieren.

Dein Versuch sieht anders aus, als das, was angeblich funktioniert. Das war:
Code:
RESTORE DATABASE [db_Name] FILE = N'db_Name'
   FROM DISK = N'E:\Pfad des Backups\db_Name.bak'
   WITH FILE = 1,
   MOVE N'db_Name' TO N'..PathWithFile.mdf',
   MOVE N'db_Name_log' TO N'..PathWithFile.LDF',
   NOUNLOAD,
   REPLACE
Ach und ganz nebenbei: Wieso "glaubst" Du?
Was ist mit Fehlerbehandlung, ErrorCode, ErrorText?

hoika 14. Jan 2020 14:53

AW: MSSQL DB Restore Problem
 
Hallo,
"Funktioniert nicht", ist keine Fehlermeldung...

Was klappt konkret nicht, kommt ein SQL-Fehler?

Der müsste auch kommen, weil Parameter nicht für DB-Name (Tabellen usw.) benutzt werden können
(so ist es z.B. bei Firebird).

ein
Delphi-Quellcode:
Select Name From Person
Where PersonenNr=:PersonenNr
ParamByName('PersonenNr').AsInteger:= 1;
klappt

ein
Delphi-Quellcode:
Select Name From :Table
Where PersonenNr=:PersonenNr
ParamByName('Table').AsString:= 'Person'
klappt nicht

Das sollte auch klar ein,
weil ein Prepare der Query (dafür sind die Parameter ja u.a. da)
nicht klappen kann, weil der DB-Server ja gar nicht weiss, mit welcher Tabelle du etwas vorhast.

Pet04 14. Jan 2020 15:02

AW: MSSQL DB Restore Problem
 
Sorry

Die Fehlermeldung lautet:

" Ein Parameterobjekt ist nicht ordnungsgemäß definiert.
Inkonsistente oder unvollständige Informationen wurden eingegeben"

Eine Fehlerbehandlung habe ich auch.
Hatte sie nur nicht mit im Code kopiert.
Code:
 

// Funktionierende Version
try
  with ADOQ1 do
          begin
         
            ProgressBar2.Position := 50;
            SQL.clear;
            SQL.Text := 'restore database :DBName from '
                        +'Disk = :BakPfadName ';              
            Parameters.ParamByName('BakPfadName').Value := sTemp;
            Parameters.ParamByName('DBName').Value := sDBName;
            ExecSQL();
          end; (*with*)        
except
on E:Exception do
messagedlg(E.Message, mtError, [mbok], 0);

jobo 14. Jan 2020 15:05

AW: MSSQL DB Restore Problem
 
Ich hab kein mssql server, aber wär mir nicht sicher, dass man den DBNAME nicht angeben kann.
In einer Query bedeutet eine dynamische Tabelle ja, das jeweils andere Felder und Typen verfügbar wären, deswegen dürfen Tabellennamen wahrscheinlich nicht parametriert werden.

Das ist aber bei diesem Statement nicht so. Es ist ja mehr oder weniger eine Prozeduraufruf mit einer handvoll Parameter (u.a. DBNAME). Keiner dieser Parameter ändert durch einen Wertewechsel die Dynamik des Gesamtstatements.

Vermutlich hat ja sein alter Aufruf mit Param DBName tatsächlich funktioniert. Hier fehlt sicher nur die richtige Aufrufsyntax, ein Komma, ein N'' oder sowas.

Wenn er Fehlerbehandlung einbauen würde, bekäme er es sicher schwarz auf weiß, was hakt.


P.S: roter Balken:
Das ist natürlich die tolle ADO Standardmeldung die gar nichts sagt. Hurra!

Also nimm tatsächlich stückweise die Paramter raus und statt dessen statische Werte, bis Du den Übeltäter hast.
Und natürlich die Syntax aus MM Studio so exakt wie möglich nachbilden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:45 Uhr.
Seite 1 von 2  1 2   

Powered by vBulletin® Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2019 by Daniel R. Wolf