Copiare file .mdf da codice C#

martedì 21 aprile 2009 - 10.09

WilOhmsford Profilo | Newbie

Ciao a tutti. Mi trovo a dover effettuare la copia di backup del file .mdf di SQL Server 2005 Express all'interno della mia applicazione WinForm scritta in C#. Ovviamente non è semplicissimo perchè il file risulta "in uso", per cui l'operazione di copia non può andare a buon fine. Mi scuso per la mia ignoranza, ed effettivamente non so nemmeno se ho postato nella sezione giusta, ma esiste un modo per "disconnettere" temporaneamente il file del database per il tempo necessario alla copia, salvo poi "riattivarlo" subito dopo?
Spero di essermi spiegato, grazie a chi mi saprà aiutare

lbenaglia Profilo | Guru

>Ciao a tutti. Mi trovo a dover effettuare la copia di backup
>del file .mdf di SQL Server 2005 Express all'interno della mia
>applicazione WinForm scritta in C#.

Ciao Carlo,

La copia del file .mdf non ti garantisce un "backup" consistente del db dato che un database è SEMPRE costituito da almeno 2 files: il Master Data File (.mdf) ed il Transaction Log (.ldf).
Teoricamente per garantire una copia consistente di tali files dovresti arrestare il servizio SQL Server, comportando un disservizio agli utenti. Fortunatamente esiste un metodo standard che consiste nell'eseguire un backup tramite il comando T-SQL BACKUP DATABASE:
http://msdn.microsoft.com/it-it/library/ms186865.aspx

Ad ogni modo ti sconsiglio di eseguire questa operazione dalla tua applicazione client, ma sarebbe opportuno schedularne l'esecuzione tramite lo scheduler di sistema (eseguendo il comando T-SQL tramite l'utility command line sqlcmd.exe):
http://msdn.microsoft.com/en-us/library/ms162773.aspx

>Spero di essermi spiegato, grazie a chi mi saprà aiutare
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

WilOhmsford Profilo | Newbie

Ciao Lorenzo, grazie per avermi risposto. Ho utilizzato la prima soluzione che mi hai proposto perchè è quella che mi pare più adatta per il mio progetto, che è estremamente piccolo e semplice. Tuttavia non sono riuscito a farlo funzionare. Mi spiego: è una solution in C#, e il DB è in Sql Server 2005 Express. Il file .mdf ed il relativo .ldf sono compresi nella cartella del progetto, dunque "in locale".

Il codice da me usato è questo:

try { SqlConnection conbk = new SqlConnection("mia_connection_string"); conbk.Open(); string bkp = @"BACKUP DATABASE nome_database TO DISK='C:\Backup\Database1.mdf'"; SqlCommand cmdbk = new SqlCommand(bkp, conbk); cmdbk.ExecuteNonQuery(); conbk.Close(); } catch (Exception exbk) { MessageBox.Show(exbk.Message); }

Tuttavia ottengo un errore di questo tipo :"impossibile trovare la voce di sysdatabases per il database ''. Nessuna voce con il nome specificato".

Se ho ben capito non mi trova proprio il database, probabilmente perchè risulta "non connesso".
Per prova, ho creato un nuovo database ed eseguito la query "BACKUP DATABASE nome_database TO DISK='C:\Backup\Database1.mdf'" con SQL Server Management Studio Express e funziona tutto alla perfezione. Che cosa sbaglio/dimentico??

lbenaglia Profilo | Guru

>Se ho ben capito non mi trova proprio il database, probabilmente
>perchè risulta "non connesso".
Se utilizzi le User Instances è probabile che sia disconnesso.
A quel punto puoi veramente copiarti solo il file .mdf... anche se detesto profondamente questa "feature" introdotta in SQL Server 2005 Express e che se non ricordo male già deprecata in SQL Server 2008 Express.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2023
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5