PDA

View Full Version : #Restore database with c



chatravin
چهارشنبه 12 مهر 1385, 14:36 عصر
من یک برنامه نوشتم که شامل Backup گرفتن از یک دیتابیس هست. در ضمن چون در تمام
طول برنامه از این Database استفاده میشود یک سری ‍Connection هم به آن برقرار و بلافاصله بعد از انجام عملیات بسته میشود. مشکل اینجاست که اگر تا قبل از Restore کردن حتی یک Connection برقرار شود ، در هنگام Restore کردن خطای زیر اتفاق می افتد:



[Microsoft][ODBC SQL Server Driver][SQL Server]Exclusive access could not be obtained because the database is in use.
[Microsoft][ODBC SQL Server Driver][SQL Server]RESTORE DATABASE is terminating abnormally.]


کد مربوط به Restore و کد نمونه ای که یک Connection به Database برقرار و در رویداد From_Load اجرا میشود به صورت زیر است:




private void Restore()
{
try
{

SQLDMO.SQLServer srv = new SQLDMO.SQLServer();
srv.LoginSecure = true;
srv.Connect("(local)", "sa", "");
SQLDMO.Restore res = new SQLDMO.RestoreClass();
res.Devices = res.Files;
res.Files = @"C:\DbBackup";
res.Database = "database1";
res.ReplaceDatabase = true;
res.SQLRestore(srv);
MessageBox.Show("Database restored successfully.", "Restore Successfull");

}
catch (Exception err)
{
//this.Cursor = Cursors.Default;
MessageBox.Show(err.Message, "Error");
}
}

private void Form1_Load(object sender, EventArgs e)
{
SqlConnection cn = new SqlConnection();
cn.ConnectionString = CONNECTION_STRING;
SqlCommand cm = new SqlCommand("", cn);
cm.CommandText = "SELECT * FROM table1";
cn.Open();
SqlDataReader dr = cm.ExecuteReader();
while (dr.Read())
{
}
cn.Close();
dr.Close();

}

chatravin
دوشنبه 17 مهر 1385, 09:55 صبح
خوب حالا که هیچ کس جواب من را نداده حداقل خودم اینکار رو میکنم تا اگر یک نفر دیگه به این مشکل برخورد کارش راه بیافته. راه حل اینکه قبل از اجرای Restore یک Stored Procedure که تمام Connectionها به Database رو Kill می کنه اجرا بشه. کد T-Sql آن هم به صورت زیره که باید در دیتابیس master قرار بگیره :


CREATE PROC sp_dbm_kill_users @dbname sysname, @delay DATETIME = '00:00' AS
/************************************************** *****************************/
/* This procedure executes KILL for all connections in the specified database. */
/* The procedure can be mofified so it kills all connections for a server. */
/* The procedure takes the following parameters: */
/* @dbname SYSNAME (required): Database name. */
/* @delay DATETIME (optional) [0] : Optional delay (s) before resume. */
/* Written by Tibor Karaszi and Börje Carlsson 1999. www.dbmaint.com */
/* Tested on verion 6.5, 7.0 and 8.0. */
/************************************************** *****************************/
SET NOCOUNT ON
--Get version number and verify supported version
DECLARE @ver VARCHAR(7)
SELECT @ver = CASE
WHEN CHARINDEX('6.50', @@VERSION) > 0 THEN '6.50'
WHEN CHARINDEX('7.00', @@VERSION) > 0 THEN '7.00'
WHEN CHARINDEX('8.00', @@VERSION) > 0 THEN '8.00'
ELSE 'Unknown'
END
IF @ver = 'Unknown'
BEGIN
RAISERROR('Unsupported version of SQL Server.',16,1)
RETURN -101
END

DECLARE loop_name INSENSITIVE CURSOR FOR
SELECT spid
FROM master..sysprocesses
WHERE dbid = DB_ID(@dbname)

OPEN loop_name
DECLARE @conn_id SMALLINT
DECLARE @exec_str VARCHAR(255)
FETCH NEXT FROM loop_name INTO @conn_id
WHILE (@@fetch_status = 0)
BEGIN
SELECT @exec_str = 'KILL ' + CONVERT(VARCHAR(7), @conn_id)
EXEC( @exec_str )
FETCH NEXT FROM loop_name INTO @conn_id
END
DEALLOCATE loop_name

WAITFOR DELAY @delay

GO



برای صدا زدن Stored Procedure می توان از کد زیر استفاده کرد:

string connectionString = CONNECTION_STRING;
SqlConnection cn = new SqlConnection(CONNECTION_STRING);
SqlCommand cm = new SqlCommand("master.dbo.sp_dbm_kill_users", cn);
cm.CommandType = CommandType.StoredProcedure;
cm.Parameters.Add("@dbName", SqlDbType.VarChar).Value = "BodyBuilding";
cm.Parameters.Add("@Delay", SqlDbType.DateTime).Value = "00:00:00";
cn.Open();
cm.ExecuteNonQuery();

cn.Close();
cn.Dispose();
cm.Dispose();

امیدوارم این راه حل کارتون رو راه بیندازه.:چشمک:

sepehr.net
دوشنبه 30 اردیبهشت 1387, 21:50 عصر
آقا دستت درد نکنه من که خیلی دنبالش میگشتم

danial82
سه شنبه 31 اردیبهشت 1387, 09:15 صبح
دستور براي Backup گرفتن

@"BACKUP DATABASE Northwind TO DISK='C:\backup.bak'"

دستور براي Restore كردن


"ALTER DATABASE agency SET SINGLE_USER with ROLLBACK IMMEDIATE " +
"use master " +
" RESTORE DATABASE Northwind FROM DISK='C:\\backup.bak'";

danial82
پنج شنبه 23 آبان 1387, 21:49 عصر
اینم یک pdf در این مورد
http://barnamenevis.org/forum/attachment.php?attachmentid=25462&d=1226600148