PDA

View Full Version : سوال: مشکل در بازیابی دیتابیس حجیم



mahdidabaghi
شنبه 21 مرداد 1391, 16:33 عصر
سلام خدمت دوستان
یه کد میذارم خدمتتون که با اون هم راحت بکاپ میگیرم و هم میتونم بکاپمو بازیابی کنم.ولی زمانی که حجم دیتابیس بالا میره (مثلا چند صد مگ میشه) اونوقت بازم میشه پکاپ بگیرم ولی دیگه نمیتونم بکاپمو بازیابی کنم.میشه منو راهنمایی کنین چرا این مشکل بوجود میاد؟

public void Backup(string strFileName)
{
try
{
string command = @"BACKUP DATABASE [Miras] TO DISK = N'" + strFileName + "' WITH NOFORMAT, NOINIT, NAME = N'Miras-Full Database Backup', SKIP, NOREWIND, NOUNLOAD, STATS = 10";
SqlCommand oCommand = null;
SqlConnection oConnection = null;
string scnn = @"Data Source=.;Initial Catalog=Miras;Integrated Security=True";
oConnection = new SqlConnection(scnn);
if (oConnection.State != ConnectionState.Open)
oConnection.Open();
oCommand = new SqlCommand(command, oConnection);
oCommand.ExecuteNonQuery();
oConnection.Close();
}
catch
{
}
}
public void Restore(string strFileName)
{
try
{
string command = "use master; RESTORE DATABASE [Miras] FROM DISK = N'" + strFileName + "'with FILE = 1, NOUNLOAD, REPLACE, STATS = 10; use Miras;";
SqlCommand oCommand = null;
SqlConnection oConnection = null;
string scnn = @"Data Source=.;Initial Catalog=Miras;Integrated Security=True";
oConnection = new SqlConnection(scnn);
if (oConnection.State != ConnectionState.Open)
oConnection.Open();
oCommand = new SqlCommand(command, oConnection);
oCommand.ExecuteNonQuery();
oConnection.Close();
}
catch
{

}
}

mahdidabaghi
شنبه 21 مرداد 1391, 19:08 عصر
سلام، برای کارهای طولانی و سنگین از شی backgroundworker استفاده کن. این شی رو از منوی toolbox و از قسمت component به فرم اضافه کن. این شی دو رویداد مهم داره که باید کد نویسی کنی.
1. رویداد DoWork: کد اصلی رو در این قسمت میذاری.
2. رویداد RunWorkerCompleted : اجرای دستورات اصلی رو که در رویداد DoWork نوشته بودی اینجا انجام میدی.
واسه شما اینجوری میشه:
کد Dowork :

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
string command = "use master; RESTORE DATABASE [Miras] FROM DISK = N'" + strFileName + "'with FILE = 1, NOUNLOAD, REPLACE, STATS = 10; use Miras;";
string scnn = @"Data Source=.;Initial Catalog=Miras;Integrated Security=True";
oConnection = new SqlConnection(scnn);
if (oConnection.State != ConnectionState.Open)
oConnection.Open();
oCommand = new SqlCommand(command, oConnection);

}
کد رویداد RunWorkerCompleted :

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
oCommand.ExecuteNonQuery();
oConnection.Close();
MessageBox.Show("عملیات بازگردانی اطلاعات با موفقیت انجام شد");
}
درون دکمه restore هم کد زیر رو قرار بدید:

private void btnrestore_Click(object sender, EventArgs e)
{
if (!backgroundWorker1.IsBusy)
backgroundWorker1.RunWorkerAsync();
}
ممنون
ولی میشه بگین کد restore رو کجا باید بذارم؟
من کد دکمه انجام عملیاتو اینجا میذارم که طرف اول انتخاب میکنه پکاپ میخاد بگیره یا میخار رستور کنه.بعدشم ادرس رو انتخاب میکنه و دکمه انجام عملیاتو میزنه.

if (TxtAddress.Text != "")
{
if (RdoBackup.Checked == true)
{
try
{
MyClass MC = new MyClass();
MC.Shrink_Database();
MC.Shrink_Log();
BackupRestore BR = new BackupRestore();
BR.Backup(strFileName);
MessageBox.Show("پشتیبان گیری اطلاعات با موفقیت انجام شد", "پیغام برنامه", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1);
}
catch
{
MessageBox.Show("پشتیبان گیری با شکست مواجه شد", "پیغام برنامه", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1);
}
}
else if (RdoRestore.Checked == true)
{
try
{
BackupRestore BR = new BackupRestore();
BR.Restore(strFileName);
MessageBox.Show("بازیابی اطلاعات با موفقیت انجام شد", "پیغام برنامه", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1);
}
catch
{
MessageBox.Show("بازگردانی با شکست مواجه شد", "پیغام برنامه", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1);
}
}
}
else
MessageBox.Show("لطفا ابتدا آدرس موردنظر راانتخاب نمایید", "پیغام برنامه", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1);

mahdidabaghi
شنبه 21 مرداد 1391, 20:13 عصر
مهندس جان مرسی از کمکت
شرمنده من تا حالا اصلا با این ابزار کار نکرده بودم.ولی بالاخره با کمکتون تونستم مشکلمو حل کنم.البته یه خط کد شما رو کامنت کردم تا برنامم جواب داد وگره گیرمیداد که بازیابی با شکست مواجه شد.در نتیجه کد برنامم این شد.

if (!backgroundWorker1.IsBusy)
{
//backgroundWorker1.RunWorkerAsync();
BackupRestore BR = new BackupRestore();
BR.Restore(strFileName);
MessageBox.Show("بازیابی اطلاعات با موفقیت انجام شد", "پیغام برنامه", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1);
}
بازم مرسی

mahdidabaghi
شنبه 21 مرداد 1391, 21:48 عصر
سلام، برای کارهای طولانی و سنگین از شی backgroundworker استفاده کن. این شی رو از منوی toolbox و از قسمت component به فرم اضافه کن. این شی دو رویداد مهم داره که باید کد نویسی کنی.
1. رویداد DoWork: کد اصلی رو در این قسمت میذاری.
2. رویداد RunWorkerCompleted : اجرای دستورات اصلی رو که در رویداد DoWork نوشته بودی اینجا انجام میدی.
واسه شما اینجوری میشه:
کد Dowork :

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
string command = "use master; RESTORE DATABASE [Miras] FROM DISK = N'" + strFileName + "'with FILE = 1, NOUNLOAD, REPLACE, STATS = 10; use Miras;";
string scnn = @"Data Source=.;Initial Catalog=Miras;Integrated Security=True";
oConnection = new SqlConnection(scnn);
if (oConnection.State != ConnectionState.Open)
oConnection.Open();
oCommand = new SqlCommand(command, oConnection);

}
کد رویداد RunWorkerCompleted :

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
oCommand.ExecuteNonQuery();
oConnection.Close();
MessageBox.Show("عملیات بازگردانی اطلاعات با موفقیت انجام شد");
}
درون دکمه restore هم کد زیر رو قرار بدید:

private void btnrestore_Click(object sender, EventArgs e)
{
if (!backgroundWorker1.IsBusy)
backgroundWorker1.RunWorkerAsync();
}

بازم سلام و بازم شرمنده که دوباره مزاحم میشم
من طبق فرمایش شما کد های بکاپو تو dowork و runwork(دقیقا مثل خودتون) گذاشتم ولی الان موندم چجوری وقتی کاربر رادیوی پشتیبان گیری رو انتخاب میکنه و دکمه انجام عملیاتو میزنه بره دستورات backgroundworkero رو اجرا کنه
اگه سوالام مبتدیانس به بزرگی خودتون ببخشین
ممنون میشم کمکم کنین