PDA

View Full Version : سوال: مشکل در restore کردن بانک sql



moon_shine
شنبه 04 تیر 1390, 08:20 صبح
سلام
منم مثل یکی دیگه از دوستان در حالی که کد restore کردن بانک رو در c# نوشتم ولی با خطای
Exclusive access could not be obtained because the database is in use.
Restore Database is terminating abnormally
مواجه شدم :ناراحت:
خواهش میکنم زودتر کمک کنید
در ضمن در C# نمیشه از دستور killAllProcess استفاده کنم یعنی این دستور تولیست دستوراتم نیست ! :افسرده:

Esmail Solhkhah
شنبه 04 تیر 1390, 20:03 عصر
دوست عزیز
تو برنامه زیر دوتا متد نوشتم یکی برای بدست آوردن تعداد کانکشنهای باز به دیتابیست
دومی برای Kill کردن همه اونا
قبل از Restore کردن دیتابیس، اول با استفاده از متد دوم تمام کانشنها رو Kill کن
موفق باشی

moon_shine
یک شنبه 05 تیر 1390, 11:40 صبح
سلام ممنون از راهنمایی تون
ولی من از .net 2005 استفاده می کنم و فایل شما باز نمی شه
ممکنه کد اش رو برام بفرستید؟
خیلی ممنون

Esmail Solhkhah
دوشنبه 06 تیر 1390, 03:28 صبح
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace RestoreDB
{
public partial class Form1 : Form
{
string dbName = "Test";
string ServerConStr = @"Data Source = .\SQLEXP2005;Integrated Security = SSPI";

public Form1()
{
InitializeComponent();
}

private void KillConnectionWithTSQL()
{
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);
}
}

private void GetActiveConnectionWithTSQL()
{
try
{
using (SqlConnection con = new SqlConnection(ServerConStr))
{
string query = @"SELECT
(select count(*) from master.dbo.sysprocesses p where dtb.database_id=p.dbid) AS [ActiveConnections]
FROM master.sys.databases AS dtb
WHERE (dtb.name=N'" + dbName + "')";
if (con.State != ConnectionState.Open)
con.Open();
SqlCommand cmd = con.CreateCommand();
cmd.CommandText = query;
var result = cmd.ExecuteScalar();
if (result != null)
lblActiveConnections.Text = result.ToString();
else
lblActiveConnections.Text = "0";

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

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

private void button1_Click(object sender, EventArgs e)
{
dbName = textBox1.Text;

GetActiveConnectionWithTSQL();
}

private void button2_Click(object sender, EventArgs e)
{
dbName = textBox1.Text;
KillConnectionWithTSQL();
GetActiveConnectionWithTSQL();

}
}
}

moon_shine
یک شنبه 19 تیر 1390, 12:21 عصر
ممنون از توضیحتون
ولی با قرار دادن این کد من با چند تا خطا روبرو شدم از جمله:
invlid object name 'master.sys.dm_tran_locks
invlid object name 'master.sys..database
البته من واسه برنامه ام دارم از sql2000 و .net2005 استفاده میکنم
ممنون میشم واسه حل این خطاها کمکم کنید
در ضمن در برنامه تون دو تا دکمه دارید میتونم بپرسم نقش اون دکمه ها چیه؟ میشه توضیح برنامه تون رو به طور خلاصه بدید
خیلی ممنون

Esmail Solhkhah
یک شنبه 19 تیر 1390, 17:25 عصر
یکی برای گرفتن تعداد کانکشنهای باز به دیتابیسه

اون یکی هم برای Kill کردن تمام کانکشنهای باز

طبیعتا شما باید قبل از Kill کردن از تعداد کانکشنهای باز مطلع باشید چون ممکنه برنامه تحت شبکه باشه و هر کانکشن باز به منزله یه کاربر باشه که داره از برنامه استفاده میکنه.

پس شما باید اول مطمئن باشید که کانکشن بازی نداردید

ولی اگه در هر صورت خواستید این کار رو بکنید میتونید با دکمه دوم تمام کانکشنها رو Kill کرده بعد با خیال راحت دیتابیس رو ریستور کنید.

کد مربوط به ریستور رو نذاشتم چون ظاهرا شما خودتون این کد رو نوشتید که داره بهتون خطای Exclusive access could not be obtained because the database is in use. v رو میده.

ضمنا برای کار با SQL 2000 هم میتونید از SQLDMO استفاده کنید.

موفق باشید.

علی فتحی
یک شنبه 21 مهر 1392, 17:17 عصر
http://barnamenevis.org/showthread.php?421305-دیالوگ-سازی-bakeup-and-restore