PDA

View Full Version : قطع کلیه ارتباطها با دیتابیس



smt1383
یک شنبه 12 اردیبهشت 1389, 15:24 عصر
با سلام
من می خواهم در یک برنامه یک بانک اطلاعاتی را Restore نمایم (با استفاده از دستورات smo) زمانیکه هنوز به بانک اطلاعاتی متصل نشده ام برنامه درست کار می کند. اما اگر پس از ارتباط با بانک اطلاعاتی بخواهم Restore کنم برنامه error می دهد. برای اینکه باید تمام ارتباطها با دیتابیس قطع باشد. قبل از restore کردن ارتباطهایی که خودم در برنامه با دیتابیس برقرار کرده ام را قطع می کنم اما باز هم برنامه error می دهد. چگونه می توان تمامی ارتباطهای موجود با یک دیتابیس را قطع کرد تا عملیات Restore با مشکل مواجه نشود؟

com_engineer_ab
یک شنبه 12 اردیبهشت 1389, 17:44 عصر
با سلام
من می خواهم در یک برنامه یک بانک اطلاعاتی را Restore نمایم (با استفاده از دستورات smo) زمانیکه هنوز به بانک اطلاعاتی متصل نشده ام برنامه درست کار می کند. اما اگر پس از ارتباط با بانک اطلاعاتی بخواهم Restore کنم برنامه error می دهد. برای اینکه باید تمام ارتباطها با دیتابیس قطع باشد. قبل از restore کردن ارتباطهایی که خودم در برنامه با دیتابیس برقرار کرده ام را قطع می کنم اما باز هم برنامه error می دهد. چگونه می توان تمامی ارتباطهای موجود با یک دیتابیس را قطع کرد تا عملیات Restore با مشکل مواجه نشود؟
دیتابیس رو از حالت multi user به single user تبدیل کن

FastCode
یک شنبه 12 اردیبهشت 1389, 19:26 عصر
یه دستور وجود داره که تمام connection ها رو میبنده.
میتونی از اون استفاده کنی.
فقط میشکلش اینه که باید admin باشی.

راه دیگه اینه که سرور رو خاموش کنی.
بعد کپی کنی.
بعد روشن کنی.

راه دیگه اینه که سرور رو restart کنی. بعد قبل از اینکه کسی connect بشه backup بگیری.

smt1383
دوشنبه 13 اردیبهشت 1389, 08:41 صبح
من با کد زیر ابتدا دیتابیس رو single user کردم و بعد دستورات Restore را اجرا کردم اما باز هم مشکل حل نشد:


Database.UserAccess = Microsoft.SqlServer.Management.Smo.DatabaseUserAcc ess.Single

com_engineer_ab
دوشنبه 13 اردیبهشت 1389, 10:02 صبح
من با کد زیر ابتدا دیتابیس رو single user کردم و بعد دستورات Restore را اجرا کردم اما باز هم مشکل حل نشد:


Database.UserAccess = Microsoft.SqlServer.Management.Smo.DatabaseUserAcc ess.Single
از این کد استفاده کن


#region RestoreBackup
public static bool RestoreBackup(string filename, string Database_Name)
{
bool sign = false;
// server = ".\\SQLEXPRESS";
string file = Path.GetFileName(filename);
string backupDir = "";
RegistryKey registry;
try
{
registry = Registry.LocalMachine.OpenSubKey("SOFTWARE").OpenSubKey("Microsoft").OpenSubKey("Microsoft SQL Server").OpenSubKey("MSSQL.1").OpenSubKey("MSSQLServer");
backupDir = registry.GetValue("BackupDirectory").ToString();
}
catch (Exception ex)
{
Error = ex.Message;
//throw new Exception("تهیه پشتیبان فقط برای کاربرهای با سطح دسترسی مدیر در ویندوز امکان پذیر است.\nکاربر ویندوز شما قادر به تهیه پشتیبان نیست.", ex);
}
string dbName = GetDatabaseName();
IDbConnection connection = new SqlConnection(string.Format("Server={1};initial catalog={0};Integrated Security=SSPI", dbName, server));
connection.Open();
IDbCommand command = connection.CreateCommand();
string defaultDB = connection.Database;
string tmpBackupFile = backupDir + "\\" + file;
System.Data.IDbTransaction tran;
try
{
//System.Data.SqlClient.SqlTransaction transaction;
//tran = connection.BeginTransaction(IsolationLevel.ReadCom mitted);
//command.Transaction = tran;
SqlCommand Cmd_Single = new SqlCommand();
//Cmd_Single.Connection = con;
string Cmd_Singletext = "ALTER DATABASE " + dbName + " SET SINGLE_USER with ROLLBACK IMMEDIATE";
command.CommandText = Cmd_Singletext;
command.ExecuteNonQuery();

File.Copy(filename, tmpBackupFile, true);
connection.ChangeDatabase("master");
command.CommandText = "RESTORE DATABASE " + defaultDB + " FROM DISK=N'" + tmpBackupFile + "' WITH REPLACE";
command.ExecuteNonQuery();
connection.ChangeDatabase(defaultDB);
File.Delete(tmpBackupFile);

Cmd_Singletext = "ALTER DATABASE " + dbName + " SET MULTI_USER";
command.CommandText = Cmd_Singletext;
command.ExecuteNonQuery();
sign = true;
// tran.Commit();
}
catch (Exception ex)
{
Error = ex.Message;
sign = false;
// Attempt to roll back the transaction.
try
{
// tran.Rollback();
}
catch (Exception ex2)
{
Error += ex2.Message;
// This catch block will handle any errors that may have occurred
// on the server that would cause the rollback to fail, such as
// a closed connection.
Console.WriteLine("Rollback Exception Type: {0}", ex2.GetType());
Console.WriteLine(" Message: {0}", ex2.Message);
}
}
connection.Close();
return sign;
}
#endregion

smt1383
شنبه 18 اردیبهشت 1389, 09:41 صبح
با تشکر از دوستان. من می خواستم با دستورات smo این کار را انجام دهم که مشکل من حل شد. برای این منظور ابتدا کلیه ارتباطهایی که خودم با دیتابیس برقرار کرده بودم را قطع کردم و سپس قبل از Restore کردن، این دو خط کد را نوشتم و برنامه جواب داد:



Database.UserAccess = Microsoft.SqlServer.Management.Smo.DatabaseUserAcc ess.Single;
Server.KillAllProcesses(Database.Name);

amirghazali
شنبه 18 اردیبهشت 1389, 12:02 عصر
سلام دوست عزیز
من هم قبلا با این مشکل درگیر بودم. دستور Server.KillAllProcesses را هم استفاده کردم ولی مشکل حل نشد! تا اینکه کامپوننت زیر را اصلاح کردم و الان با Sql Server 2008 و تحت شبکه! براحتی کار میکنه .
فایل SMG.zip را از لینک زیر دریافت کنید :
http://www.barnamenevis.org/forum/showthread.php?t=218782&page=2