# پایگاه‌های داده > SQL Server >  Error در Restore

## اقاقيا

با سلام به همه دوستان..
من به كمك كد زير مي خوام كه ديتابيسم رو Restore كنم ولي Error ميده...

if (opd.ShowDialog() == DialogResult.OK)
{
string path = opd.FileName;
string ServerName = "localhost";
string DatabaseName = "soha";
string UserName = "sohadialyze";
string Password = "1";
string cs = "";
try
{
cs = "server={0};database={1};uid={2};pwd={3};";
cs = string.Format(cs, ServerName, DatabaseName, UserName, Password);
SqlConnection connection = newSqlConnection(cs);
string sql = "RESTORE DATABASE soha FROM DISK = '{0}'";
sql = string.Format(sql, path);
SqlCommand command = newSqlCommand(sql, connection);
command.CommandType = CommandType.Text;
connection.Open();
command.ExecuteNonQuery();
connection.Close();
MessageBox.Show("بازيابي ديتابيس از مسير دلخواه با موفقيت انجام شد");
}
catch
{
MessageBox.Show("اشکال در ارتباط با بانک اطلاعاتی");
}
}



متن Error: 
RESTORE cannot process database 'soha' 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

لطفا بگين چطور اين Error رو رفع كنم.. :متفکر: 
از راهنماييتون ممنون مي شم...

----------


## حمیدرضاصادقیان

سلام.شما وقتی داری restore میکنی نباید هیچ کانکشنی به اون وصل باشه.اگر به دیتابیست connection ی وصل هست حتما باید اون کانکشن رو از بین ببری.

----------


## اقاقيا

> اگر به دیتابیست connection ی وصل هست حتما باید اون کانکشن رو از بین ببری.


با سلام
 ميشه بگين دقيقا چطور بايد اين كار رو بكنم؟؟؟
آيا با كد زير كانكشن بسته نميشه؟؟؟

connection.Close();

----------


## حمیدرضاصادقیان

سلام. من با این کد کانکشن هایی که به دیتابیسم وصل هست رو پیدا میکنم و در یک حلقه for همشو از بین میبرم.

        select spid from master..sysprocesses where dbid=db_id('Test')

با این دستور از بین می برمش.

kill spid

منظور از Spid مقداری هست که این فیلد داره.

----------


## اقاقيا

با سلام
ممنون از راهنماييتون...ولي ميشه واضح تر توضيح بدين... :متفکر: 
يا اينكه يك مثال و نمونه كد بطور كامل بذاريد؟؟؟
dbid دقيقا چيه؟؟



> منظور از Spid مقداری هست که این فیلد داره.


مقدار كدام فيلد مد نظر شماست؟؟

----------


## حمیدرضاصادقیان

سلام .اون تستی که من نوشتم نام دیتابیس شماست.به جای اون نام دیتابیست رو قرار بده. spid شماره کانکشن هایی هست که به دیتابیس شما وصل هست.ممکنه تعدادش از یکی به بالا ادامه داشته باشه. که میتونی در برنامه ات چک کنی اگر بزرگتر از صفر بود در یک حلقه تا زمانی که query به انتها نرسید Spid (همون شماره کانکشنی که به دیتابیس شما وصل هست) رو جلوی دستور kill قرار بده و اونو از بین ببر.
موفق باشید.

----------


## اقاقيا

> میتونی در برنامه ات چک کنی اگر بزرگتر از صفر بود در یک حلقه تا زمانی که query به انتها نرسید Spid (همون شماره کانکشنی که به دیتابیس شما وصل هست) رو جلوی دستور kill قرار بده و اونو از بین ببر.
> موفق باشید.


با سلام
ممكنه توضيح بدين اين حلقه رو چطور ايجاد كنم؟؟
راستي برنامه من Kill رو نميده...و بهم Server.KillProcess رو ميده...

----------


## NewFoxStudent

Dim SqlCmd As New SqlClient.SqlCommand, SqlConn As New SqlClient.SqlConnection, SqlReader As SqlClient.SqlDataReader
        Dim SPID As Integer
        SqlConn.ConnectionString = "Data Source=(ServerName);Initial Catalog=(DataBaseName);User ID=sa;Password=;Connect Timeout=50"
        SqlConn.Open()
        SqlCmd.Connection = SqlConn
        SqlCmd.CommandText = "select spid from master..sysprocesses where dbid=db_id('Test')"
        SqlReader = SqlCmd.ExecuteReader()
        Do While SqlReader.Read
            SPID = SqlReader("SpID")
            SqlCmd.CommandText = "Kill " + SPID.ToString
            SqlCmd.ExecuteNonQuery()
        Loop

----------


## اقاقيا

ممكنه براتون كد C#‎ رو هم بذاريد..
ممنون و مرسي از كمكتون...

----------


## ASKaffash

سلام
این خط کد را بجای کد خودت اضافه کن :

string DatabaseName = "master";

----------


## NewFoxStudent

SqlConnection SqlConn = newSqlConnection("Data Source=(ServerName);Initial Catalog=(DataBaseName);User ID=sa;Password=;Connect Timeout=50");
SqlCommand SqlCmd = newSqlCommand();
SqlDataReader SqlReader ;
string SPID;
SqlConn.Open();
SqlCmd.Connection = SqlConn;
SqlCmd.CommandType = CommandType.Text;
SqlCmd.CommandText = "select spid from master..sysprocesses where dbid=db_id('Test')";
SqlReader = SqlCmd.ExecuteReader();
while (SqlReader.Read())
{
SPID = SqlReader.GetString(1);
SqlCmd.CommandText = string.Concat("Kill " , SPID);
SqlCmd.ExecuteNonQuery();
}

----------


## اقاقيا

> سلام
> این خط کد را بجای کد خودت اضافه کن :
> 
> string DatabaseName = "master";


با سلام
من منظورتونو متوجه نشدم :متفکر: يعني بجاي كل كدم اين رو بنويسم؟

NewFoxStudent عزيز كد شما به خط زير error ميگيره 
SPID = SqlReader.GetString(1);
متن error :
Unable to cast object of type 'System.Int16' to type 'System.String'.
راستي يه سوال ديگه اين كد رو بايد قبل از كدي كه در پست 1 گذاشتم بذارم؟؟

----------


## NewFoxStudent

من این کد رو امتحان کردم مشکگلی نداشت
به هر حال اینجوری تغییرش بده

SPID = SqlReader.GetInt16(1).ToString();

این کدها باید قبل از کد ریستور دیتابیس باشن

----------


## اقاقيا

> من این کد رو امتحان کردم مشکگلی نداشت
> به هر حال اینجوری تغییرش بده
> 
> SPID = SqlReader.GetInt16(1).ToString();
> 
> این کدها باید قبل از کد ریستور دیتابیس باشن


با سلام
اول باید یه عذر خواهی بکنم چون می دونم تقریبا یه 2 هفته ای از آخرین پست این تاپیک گذشته...من به دلیل یکسری مشکلات نتونستم جواب بدم
مرسی از راهنماییتون ولی حالا باز یه Error دیگه میگیره به این خط 
متن error :
Index was outside the bounds of the array.
من کل کد مربوط به restore رو میذارم...
شاید اینطوری بهتر باشه..

OpenFileDialog opd = newOpenFileDialog();
opd.Filter = "(*.BAK)|*.bak";
opd.Title = "انتخاب مسير";
if (opd.ShowDialog() == DialogResult.OK)
{
string path = opd.FileName;
string ServerName = "localhost";
string DatabaseName = "soha";
string UserName = "sohadialyze";
string Password = "1";
string cs = "";
try
{
cs = "server={0};database={1};uid={2};pwd={3};";
cs = string.Format(cs, ServerName, DatabaseName, UserName, Password);
SqlConnection connection = newSqlConnection(cs);
SqlCommand SqlCmd = newSqlCommand();
SqlDataReader SqlReader;
string SPID;
connection.Open();
SqlCmd.Connection = connection;
SqlCmd.CommandType = CommandType.Text;
SqlCmd.CommandText = "select spid from master..sysprocesses where dbid=db_id('soha')";
SqlReader = SqlCmd.ExecuteReader();
while (SqlReader.Read())
{
SPID = SqlReader.GetInt16(1).ToString();
SqlCmd.CommandText = string.Concat("Kill ", SPID);
SqlCmd.ExecuteNonQuery();
}
string sql = "RESTORE DATABASE soha FROM DISK = '{0}'";
sql = string.Format(sql, path);
SqlCommand command = newSqlCommand(sql, connection);
command.CommandType = CommandType.Text;
//connection.Open();
command.ExecuteNonQuery();
connection.Close();
MessageBox.Show("بازيابي ديتابيس از مسير دلخواه با موفقيت انجام شد");
}
catch
{
MessageBox.Show("اشکال در ارتباط با بانک اطلاعاتی");
}
}

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

----------


## sahmah65

برای Restore کردن اول باید Db به حالت offline در بیاد بعد restore بشه 
کد:
Alter Database DbName Set Offline With RollBack Immediate 

حالا Restore
Restore Database dbName From Disk='Path'

در Conection String هم Databse رو بزارmaster
string Master_Con="Sever=localhost ;database=master;integrated security=true"

----------


## اقاقيا

با سلام کاری که گفته بودین رو انجام دادم ولی این error رو میده :  :ناراحت: 
The tail of the log for the database "soha" has not been backed up. Use BACKUP LOG WITH NORECOVERY to backup the log if it contains work you do not want to lose. Use the WITH REPLACE or WITH STOPAT clause of 
یکی کمک کنه  :گریه:  :گریه:  :گریه:

----------


## اقاقيا

یعنی هیچ کس نمی تونه کمکم کنه...؟؟!! :متفکر: 
نمی دونم چرا حل نمیشه  :خیلی عصبانی: 
من واقعا بهش نیاز دارم... :ناراحت:

----------


## sahmah65

> یعنی هیچ کس نمی تونه کمکم کنه...؟؟!!
> نمی دونم چرا حل نمیشه 
> من واقعا بهش نیاز دارم...


این دقیقاً کدی هستش که خودم ازش استفاده کردم . که خودت بسته به پروژه ات تنظمیش کن.


        private void btnBackUp_Click_1(object sender, EventArgs e)
        {
            if (txtBackName.Text.Length > 0 && txtBackName.Text != null)
            {



                DialogResult Result = FMessegeBox.FarsiMessegeBox.Show("آیا مایل به تهیه نسخه ی پشتیبان هستید؟", "تهیه ی پشتیبان", FMessegeBox.FMessegeBoxButtons.YesNo, FMessegeBox.FMessegeBoxIcons.Question);
                if (Result == DialogResult.Yes)
                {
                    string _BackUp = "BACKUP DATABASE Friends TO DISK=" + "'" + System.Environment.CurrentDirectory + "\\BackUPs" + "\\" + txtBackName.Text + ".bak" + "'";
                    SqlCommand BackUp = new SqlCommand(_BackUp, masters);
                    string _InsertToBackDetail = "InsertToBackDetail";
                    SqlCommand InsertToBackDetail = new SqlCommand();
                    InsertToBackDetail.CommandText = _InsertToBackDetail;
                    InsertToBackDetail.CommandType = CommandType.StoredProcedure;
                    InsertToBackDetail.Connection = FriendsConection;
                    InsertToBackDetail.Parameters.AddWithValue("@Name"  , txtBackName.Text);
                    InsertToBackDetail.Parameters.AddWithValue("@Desc"  , txtBackDef.Text);
                    masters.Open();
                    BackUp.ExecuteNonQuery();
                    masters.Close();
                    FriendsConection.Open();
                    InsertToBackDetail.ExecuteNonQuery();
                    FriendsConection.Close();
                    FMessegeBox.FarsiMessegeBox.Show("پشتیبان گیری با موفقیت انجام شد", "", FMessegeBox.FMessegeBoxButtons.Ok, FMessegeBox.FMessegeBoxIcons.Information);

                }
            }
            else
            {
                FMessegeBox.FarsiMessegeBox.Show("نسخه ی پشتیبان نمی تواند بدون نام باشد", "", FMessegeBox.FMessegeBoxButtons.Ok, FMessegeBox.FMessegeBoxIcons.Error);
            }
            
        
        }

        private void btnBacUPsNames_Click_1(object sender, EventArgs e)
        {
            using (BackUPDetailes frmBackUpDetailes = new BackUPDetailes())
            {
                frmBackUpDetailes.ShowDialog();
            }
        }

        private void btnRestore_Click_1(object sender, EventArgs e)
        {
            if (txtResName.Text.Length > 0 && txtResName.Text != null)
            {
                DialogResult Result = FMessegeBox.FarsiMessegeBox.Show("آیا مایل به بازیابی نسخه ی پشتیبان هستید؟", "بازیابی", FMessegeBox.FMessegeBoxButtons.YesNo, FMessegeBox.FMessegeBoxIcons.Question);
                if (Result == DialogResult.Yes)
                {
                    try
                    {
                        string _OffDB = "ALTER DATABASE Friends SET OFFLINE WITH ROLLBACK IMMEDIATE";
                        string _ResDB = "RESTORE DATABASE Friends FROM DISK=" + "'" + System.Environment.CurrentDirectory + "\\BackUPs" + "\\" + txtResName.Text + ".bak" + "'" + " With Replace";
                        SqlCommand OffDB = new SqlCommand(_OffDB, masters);
                        SqlCommand ResDB = new SqlCommand(_ResDB, masters);

                        masters.Open();
                        OffDB.ExecuteNonQuery();
                        ResDB.ExecuteNonQuery();
                        FMessegeBox.FarsiMessegeBox.Show("بازیابی با موفقیت انجام شد", "", FMessegeBox.FMessegeBoxButtons.Ok, FMessegeBox.FMessegeBoxIcons.Information);
                        masters.Close();
                    }
                    catch
                    {
                        string _OnDB = "ALTER DATABASE Friends SET ONLINE";
                        SqlCommand OnDB = new SqlCommand(_OnDB, masters);
                       
                        OnDB.ExecuteNonQuery();
                        masters.Close();
                        FMessegeBox.FarsiMessegeBox.Show("فایل پشتیبانی با نام وارد شده وجود ندارد", "", FMessegeBox.FMessegeBoxButtons.Ok, FMessegeBox.FMessegeBoxIcons.Error);
                    }
                }
            }
            else
            {
               
                FMessegeBox.FarsiMessegeBox.Show("نام نسخه ای را که می خواهید بازیابی شود را باید وارد کنید", "", FMessegeBox.FMessegeBoxButtons.Ok, FMessegeBox.FMessegeBoxIcons.Error);
                
            }
        }

در ضمن یه یه پیشنهاد هم به شما دارم اون هم اینه که سوال های خودتون رو حتی در زمینه ی 
پایگاه داده تو تالار های سی شارپ و وی بی دات نت مطرح کنید .چون من ندیدم اینجا به یه  سوال نسبتاً سخت  جواب درست و حسابی بدن و اکثراً نصفه  هست. 
موفق باشید.

----------


## اقاقيا

با سلام 
ممنون از راهنماييتون..
من کد شمارو هم براي backup و Restore امتحان کردم...
که Backup به راحتي گرفته مي شد...
ولي براي Restore دقيقا erorr ي که در بالا گفته بودم رو ميده:

The tail of the log for the database "soha" has not been backed up.
Use BACKUP LOG WITH NORECOVERY to backup the log if it contains work you do not want to lose.
Use the WITH REPLACE or WITH STOPAT clause of 

که من فکر ميکنم مربوط به تنظيمات Sql من ميشه
از اساتيد ميخوام که علت اين erorr رو بهم بگن...
يه موضوع ديگه اينکه بعد از تست کردن کد هاي موجود براي Restore در Sql جلوي اسم ديتابيسم تو پرانتز نوشته شده:
Restricted User

----------


## ar.mahdian

سلام میکنم به اون دوستمون که مشکل داشت
من از کدی که یکی از اساتید پیشنهاد کرده بودند استفاده کردم و بعد از چند بار امتحان و آزمون خطا به نتیجه رسیدم 
اگر میخوای این کد sql رو بهتر درک کنی پیشنهاد میکنم که توی enterprise manager  اونو تست کنی
یکی از نکات مهم این عملیات اینه که باید به پایگاه داده master  در sql sqrver  وصل بشی نه به اون پایگاهی که میخوای بازیابی کنی که البته قبلا اساتید اشاره کرده بودند
نکته دیگه اینکه باید اون سه کامند پشت سر هم اجرا بشن و بین اجرای اونا دستور دیگهای نباشه  به هر حال امیدوارم که مفید واقع بشه.


        private void button2_Click(object sender, EventArgs e)
        {
            SqlConnection con;
            SqlCommand com, com1, com2, com3;
            con = new SqlConnection("Data Source=mycom;Initial Catalog=master;Integrated Security=True");
            com1 = new SqlCommand("ALTER DATABASE mydb1 SET OFFLINE WITH ROLLBACK IMMEDIATE",con);
            com2 = new SqlCommand("RESTORE DATABASE mydb1 FROM DISK='d:\\a\\backup1'", con);
            com3 = new SqlCommand("ALTER DATABASE mydb1 SET ONLINE", con);

            con.Open();
            com1.ExecuteNonQuery();
            com2.ExecuteNonQuery();
            com3.ExecuteNonQuery();
            con.Close();
        }


فایل بکاپ من در مسیر d:\a با نام backup1 ذخیره شده 
درضمن با اینکه مطمئنم که میدونی گفتنش ضرر نداره که *به فرمت مسیر فایل بکاپ دقت کن*

----------

