PDA

View Full Version : سوال: کمک در رابطه با بازیابی بانک sql



mehdi_programer
یک شنبه 09 مرداد 1390, 14:39 عصر
سلام تمام مطالب مربوط را خواندم ولی با این پیغام خطا نمی دانم چه کنم. لطفا راهنمایی کنیید.

mehdi_programer
یک شنبه 09 مرداد 1390, 14:42 عصر
این خطا:
RESTORE cannot process database 'H:\SOURCE\APPLICATION\WORDS_APPLICATION\BIN\DEBUG \DB_WORDS.MDF' because it is in use by this session. It is recommended that the master database be used when performing this operation.
RESTORE DATABASE is terminating abnormally.

zahra_no
دوشنبه 24 مرداد 1390, 16:45 عصر
با سلام
منم دقیقا مشکل همین دوست رو دارم

این خطا برای چیست؟

البته وقتی کد رو در یک فرم خالی استفاده میکنم بدون مشکل کار میکنه ولی وقتی تو برنامه خودم که یک ترد هم هست که هر دقیقه دیتا بیس رو چک میکنه استفاده میکنم این خطا رو میده

من در مورد kill روش kill کردن رو بلد نیستم.
لطفا کمک کنید.

Esmail Solhkhah
دوشنبه 24 مرداد 1390, 17:30 عصر
خب طبیعیه برنامه خودتون بهش کانکشن باز داره

احیانا تو کانکشن استرینگ مربوط به دستورات ریستور نام دیتابیس رو به همین دیتابیس جاری اشاره نکردید؟

موقع بازیابی دیتابیس جاری باید master باشه


من در مورد kill روش kill کردن رو بلد نیستم.

این کد :

private void KillConnectionWithTSQL(string ServerConnectionString, string DataBaseName)
{
try
{
using (SqlConnection con = new SqlConnection(ServerConnectionString))
{
string query = @"SELECT DISTINCT request_session_id FROM master.sys.dm_tran_locks
WHERE resource_type = 'DATABASE'
AND resource_database_id = db_id(N'" + DataBaseName + "')";
if (con.State != ConnectionState.Open)
con.Open();
SqlCommand cmd = con.CreateCommand();
cmd.CommandText = query;
SqlDataReader reader = cmd.ExecuteReader();

List<object> pids = new List<object>();
while (reader.Read())
{
pids.Add(reader[0]);
}
reader.Close();

foreach (object Pid in pids)
{
if (Pid != null)
{
query = "KILL " + Pid;
cmd.CommandText = query;
cmd.ExecuteNonQuery();
}
}

if (con.State == ConnectionState.Open)
con.Close();
}

}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}

موفق باشید.

zahra_no
دوشنبه 24 مرداد 1390, 17:56 عصر
من با این دستور kill رو انجام میدم ولی باز همان خطا رو میدهtry
{
using (SqlConnection con = new SqlConnection(ServerConStr))
{
string query = @"SELECT DISTINCT request_session_id FROM master.sys.dm_tran_locks
WHERE resource_type = 'DATABASE'
AND resource_database_id = db_id(N'" + dbName + "')";
if (con.State != ConnectionState.Open)
con.Open();
SqlCommand cmd = con.CreateCommand();
cmd.CommandText = query;
SqlDataReader reader = cmd.ExecuteReader();

List<object> pids = new List<object>();
while (reader.Read())
{
pids.Add(reader[0]);
}
reader.Close();

foreach (object Pid in pids)
{
if (Pid != null)
{
query = "KILL " + Pid;
cmd.CommandText = query;
cmd.ExecuteNonQuery();
}
}

if (con.State == ConnectionState.Open)
con.Close();
}

}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}

دوستان کمک کنید. من به کمک فوری احتیاج دارم

zahra_no
دوشنبه 24 مرداد 1390, 18:01 عصر
برای بازیابی از این کد استفاده میکنم
master بودن رو کجا باید بزارم؟
OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.AddExtension = true;
openFileDialog.CheckFileExists = false;
openFileDialog.CheckPathExists = true;
openFileDialog.Filter = "Backup File (*.Bak)|*.Bak";
openFileDialog.DefaultExt = "Bak";
openFileDialog.RestoreDirectory = true;
if (openFileDialog.ShowDialog() == DialogResult.OK)
{
this.server = new SQLServer2Class();
this.Restor = new Restore2Class();
this.server.LoginSecure = true;
this.server.Connect(@"ZAHRA-PC\SQLEXPRESS", Missing.Value, Missing.Value);
database = (Database2)server.Databases.Item("PIM", Missing.Value);
Restor.Database = database.Name;
Restor.Files = openFileDialog.FileName;
Restor.SQLRestore(server);
server.DisConnect();
Restor = null;
server = null;
MessageBox.Show("jjgiuggvhh");
}

شرمنده میدونم بگردم پیدا میکنم
ولی واقعا وقت ندارم
بازم شرمنده دوست عزیز

Esmail Solhkhah
دوشنبه 24 مرداد 1390, 18:11 عصر
SMO or DMO?

http://www.mssqltips.com/tip.asp?tip=1849

zahra_no
دوشنبه 24 مرداد 1390, 20:16 عصر
SMO or DMO?

http://www.mssqltips.com/tip.asp?tip=1849

DMo

ممنون دوست عزیز که کمکم میکنید.

Esmail Solhkhah
دوشنبه 24 مرداد 1390, 23:46 عصر
دوست عزیز بنده این کار رو قبلا با DMO انجام دادم ولی واقعیتش ماله چند سال پیشه

کدش یادم نمونده

فعلا این لینکها رو بررسی کنید

اگه مورد حل نشد PM بدید از آرشیوم پیدا میکنم براتون سند میکنم

http://www.dotnetspider.com/resources/5082-Restore-SQL-servers-Database-using-SQLDMO.aspx

http://social.msdn.microsoft.com/Forums/en-US/sqlsmoanddmo/thread/ca18214a-d49d-4a99-a152-b80891f832eb/

موفق باشید.

zahra_no
سه شنبه 25 مرداد 1390, 00:15 صبح
قبل از restore کوئری زیر رو اجرا کنید
1
ALTER DATABASE DatabaseName SET SINGLE_USER with ROLLBACK IMMEDIATE





بعد restore رو انجام بدید مثل کوئری زیر
1
RESTORE DATABASE DatabaseName FROM DISK= 'Path' WITH FILE = 1,NOUNLOAD,REPLACE,STATS = 10





بعد کوئری زیر رو در نهایت اجرا کنید
1
ALTER DATABASE DatabaseName SET MULTI_USER





به جای DatabaseName اسم دیتابیستونو بذارید , path هم مسیر بک آپ هست

اینو دوست عزیزمون زحمت کشیدن دستش درد نکنه با این کد تونستم مشکلمو حل کنم soheila_1643 (http://barnamenevis.org/member.php?29793-soheila_1643)

Esmail Solhkhah
سه شنبه 25 مرداد 1390, 00:29 صبح
خب اونموقع DMO رو میخاید چیکار :متفکر:

اینکه شد کلا TSQL