PDA

View Full Version : سوال: قراردادن امکان پشتیبانگیری در نرم افزار



mostafa8266
جمعه 19 اسفند 1390, 19:06 عصر
سلام به همه دوستان
من دارم یک نرم افزار می نویسم که می خوام توش امکان پشتیبانگیری از بانک اطلاعاتی رو بگذارم، اگه دوستان لطف کنند و من رو راهنمایی کنن که چجوری باید این کار رو انجام بدم ممنون میشم.

mp_mp353
جمعه 19 اسفند 1390, 19:47 عصر
سلام از چه پایگاه داده ای استفاده میکنید؟

somayekhezri
جمعه 19 اسفند 1390, 20:30 عصر
private void Backupbutton_Click(object sender, EventArgs e)
{
try
{
SaveFileDialog saveFileDialog = new SaveFileDialog();
saveFileDialog.AddExtension = true;
saveFileDialog.CheckFileExists = false;
saveFileDialog.CheckPathExists = true;
saveFileDialog.OverwritePrompt = true;
saveFileDialog.FileName = "Backup";
saveFileDialog.Filter = "Backup File (*.Bak)|*.Bak";
saveFileDialog.DefaultExt = "Bak";
saveFileDialog.RestoreDirectory = true;
//saveFileDialog.InitialDirectory = "D:\\";

if (saveFileDialog.ShowDialog() == DialogResult.OK)
{
this.Cursor = Cursors.WaitCursor;

Connection DBConnection = new Connection();
DBConnection.ParamClear();
DBConnection.CommandText(@"BACKUP DATABASE [school1] TO DISK = N'" + saveFileDialog.FileName + "' WITH NOFORMAT, NOINIT, NAME = N'accounting-Full Database Backup', SKIP, NOREWIND, NOUNLOAD, STATS = 10");
if (DBConnection.Connect())
{
if (DBConnection.ExecuteNonQuery())
{
FMessageBox.Show("عملیات تهیه پشتیبان با موفقیت به اتمام رسید", "تهیه پشتیبان", FMessageBoxButtons.OK, FMessageBoxIcons.Information);
}
else
{
FMessageBox.Show("عملیات تهیه پشتیبان انجام نگردید", "تهیه پشتیبان", FMessageBoxButtons.OK, FMessageBoxIcons.Information);
}
}
else
{
FMessageBox.Show(DBConnection.Message, "تهیه پشتیبان", FMessageBoxButtons.OK, FMessageBoxIcons.Information);
}

DBConnection.Disconnect();

this.Cursor = Cursors.Default;
}
}
catch
{
FMessageBox.Show("عملیات تهیه پشتیبان با شکست مواجه شد . لطفاً مجدداً تلاش نمایید", "خطای پشتیبان گیری", FMessageBoxButtons.OK, FMessageBoxIcons.Error);
}
}

somayekhezri
جمعه 19 اسفند 1390, 21:02 عصر
private void Restorebutton_Click(object sender, EventArgs e)
{
bool QueriesResult;

openFileDialog1.Filter = "Back up (*.bak) |*.bak";
try
{
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
this.Cursor = Cursors.WaitCursor;

Connection DBConnection = new Connection();
DBConnection.ParamClear();
if (DBConnection.Connect())
{
DBConnection.CommandText("ALTER DATABASE [school1] SET OFFLINE WITH ROLLBACK IMMEDIATE");
QueriesResult = DBConnection.ExecuteNonQuery();

DBConnection.CommandText("ALTER DATABASE [school1] SET MULTI_USER");
QueriesResult = QueriesResult && DBConnection.ExecuteNonQuery();

DBConnection.CommandText("RESTORE DATABASE [school1] FROM DISK ='" + openFileDialog1.FileName + "' WITH RECOVERY,REPLACE");
QueriesResult = QueriesResult && DBConnection.ExecuteNonQuery();

if (QueriesResult)
{
FMessageBox.Show("عملیات به روزرسانی با موفقیت به اتمام رسید . لطفاً برای اعمال تغییرات مجدداً وارد برنامه شوید", "به روزرسانی پایگاه داده", FMessageBoxButtons.OK, FMessageBoxIcons.Information);
}
else
{
FMessageBox.Show("عملیات به روزرسانی پایگاه داده با شکست مواجه شد . لطفاً مجدداً تلاش نمایید", "خطای به روزرسانی", FMessageBoxButtons.OK, FMessageBoxIcons.Error);
}
}
else
{
FMessageBox.Show(DBConnection.Message, "تهیه پشتیبان", FMessageBoxButtons.OK, FMessageBoxIcons.Information);
}

DBConnection.Disconnect();

this.Cursor = Cursors.Default;
}
}
catch
{
FMessageBox.Show("عملیات به روزرسانی پایگاه داده با شکست مواجه شد . لطفاً مجدداً تلاش نمایید", "خطای به روزرسانی", FMessageBoxButtons.OK, FMessageBoxIcons.Error);
}
}

rana-writes
شنبه 20 اسفند 1390, 00:19 صبح
سلام
من چون خودم خيلي درگير بكاپ و ري استور بودم، بالاخره تونستم اين كدها رو پيدا كنم، تو پروژه اي كه براي مشتري نصب كردم جواب ميده و درست كار ميكنه
براي بكاپ يه دكمه بندازين تو فرمتون و اين كدها رو بنويسين توي بكاپ كاربر بعد از زدن يه دكمه، مسيري كه ميخواد فايلش اونجا ذخيره بشه رو انتخاب ميكنه و در واقع ذخيره ميكنه و عمل پشتيبان گيري انجام ميشه


string strFileName = string.Empty;
saveFileDialog1.DefaultExt = "BAK";
saveFileDialog1.FileName = "BackupFile" + "hh";
saveFileDialog1.Filter = @"SQL Backup files (*.BAK) |*.BAK|All files
(*.*) |*.*";
saveFileDialog1.FilterIndex = 1;
saveFileDialog1.OverwritePrompt = true;
saveFileDialog1.Title = "Backup SQL File";
if (saveFileDialog1.ShowDialog() == DialogResult.OK)
{
string File = saveFileDialog1.FileName;
Bakfile(File);
}


تابع Bakfile رو هم اينطوري بنويسين:


private void Bakfile(string file)
{
try
{
string sql = @"BACKUP DATABASE Fix TO DISK='" + file + "'";
this.Cursor = Cursors.WaitCursor;
SqlCommand command = null;
SqlConnection connection = null;
connection = Connection.ConnectToFix();// من كانكشن استرينگم رو توي يه كلاس به اسم Connection انداختم. و تابع ConnectToFix رو نوشتم، شما تو اين خط ميتونين كانكشن استرينگتون رو مستقيما درج كنين
if (connection.State != ConnectionState.Open)
connection.Open();
command = new SqlCommand(sql, connection);
command.ExecuteNonQuery();
this.Cursor = Cursors.Default;
MessageBox.Show("بكاپ انجام شد");
}
catch (Exception ex)
{
MessageBox.Show("Error Occurd :" + ex.Message);
}
}


ضمن اينكه توي فرمتون بايد يه saveFileDialog بندازين.
مسلما بعد از گرفتن بكاپ، بايد بازيابي يا همون ري استور هم داشته باشين.
اين كدها رو هم براي ري استور استفاده كنين.
توي كد دكمه ي ري استور:


string strFileName = string.Empty;
openFileDialog1.Filter = @"SQL Backup files (*.BAK) |*.BAK|All files(*.*) |*.*";
openFileDialog1.FilterIndex = 1;
openFileDialog1.Title = "Restore SQL File";
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
strFileName = openFileDialog1.FileName;
Restore(strFileName);

}

و اين هم تابع Restor


private void Restore(string strFileName)
{
try
{
string sql = "ALTER DATABASE Fix SET SINGLE_USER with ROLLBACK IMMEDIATE " +
"use master " +
" RESTORE DATABASE Fix FROM DISK='" + strFileName + "'";
this.Cursor = Cursors.WaitCursor;
SqlCommand command = null;
SqlConnection connection = null;
connection = new SqlConnection("Data Source=.;Initial Catalog=Fix ;Integrated Security=True");
if (connection.State != ConnectionState.Open)
connection.Open();
command = new SqlCommand(sql, connection);

command.ExecuteNonQuery();
this.Cursor = Cursors.Default;
// MessageBox.Show("بازيابي با موفقيت انجام شد");

this.Hide();
}
catch (Exception)
{
LblMsg.Text = "خطا در بازيابي بانك اطلاعاتي، دوباره سعي كنيد";
}

}


بايد يه OpenFileDialog تو برنامه تون بندازين
ضمن اينكه بايد دقت كنين، موقع انجام Restore كانكشن اصلي برنامه تون به ديتابيس رو باز نكرده باشين
در واقع اولين كاري كه كاربر بعد از اجراي برنامه انجام ميده بايد ري استور ديتابيس باشه و وقتي ري استور رو انجام داد، بعدا بتونه مثلا لاگين كنه و ...

موفق باشين.

mostafa8266
یک شنبه 21 اسفند 1390, 15:37 عصر
ممنون از دوستان به خاطر پاسخ هایی که دادند.
یه سوال دیگه همدارم، توی بعضی نرم افزارها پشتیبانگیری روزانه هم داره، چه فرقی بین پشتیبانگیری روزانه و پشتیبانگیری کلی وجود داره؟

rana-writes
یک شنبه 21 اسفند 1390, 23:27 عصر
ممنون از دوستان به خاطر پاسخ هایی که دادند.
یه سوال دیگه همدارم، توی بعضی نرم افزارها پشتیبانگیری روزانه هم داره، چه فرقی بین پشتیبانگیری روزانه و پشتیبانگیری کلی وجود داره؟

تفاوتي نداره
بهتره شما كلا موقع خروج از برنامه تون اين كنترل رو بذارين كه هر جايي و به هر طريقي كاربر خواست از برنامه بره بيرون، يه بكاپ گيري داشته باشه.
توي بكاپ، شما از كل ديتابيس بكاپ ميگيرن، نه از جدول خاص يا ركورد خاصي، در نتيجه تا جايي كه من اطلاع دارم،‌ هر دوتاش يكيه.
ضمن اينكه حواستون باشه حتما در مورد تخريب بانك اطلاعاتي يه بندي توي قراردادتون بذارين كه چون برنامه قابليت بكاپ و بازيابي داره و شما دارين اين رو به مشتري آموزش ميدين، در نتيجه اگه بنا به سهل انگاري مشتري به هر دليلي ديتابيسش از بين رفت و هيچ بكاپي نداشت، شما مسئوليتي نخواهيد داشت

موفق باشين

pure_love
جمعه 08 اسفند 1393, 14:12 عصر
سلام
من چون خودم خيلي درگير بكاپ و ري استور بودم، بالاخره تونستم اين كدها رو پيدا كنم، تو پروژه اي كه براي مشتري نصب كردم جواب ميده و درست كار ميكنه
براي بكاپ يه دكمه بندازين تو فرمتون و اين كدها رو بنويسين توي بكاپ كاربر بعد از زدن يه دكمه، مسيري كه ميخواد فايلش اونجا ذخيره بشه رو انتخاب ميكنه و در واقع ذخيره ميكنه و عمل پشتيبان گيري انجام ميشه


string strFileName = string.Empty;
saveFileDialog1.DefaultExt = "BAK";
saveFileDialog1.FileName = "BackupFile" + "hh";
saveFileDialog1.Filter = @"SQL Backup files (*.BAK) |*.BAK|All files
(*.*) |*.*";
saveFileDialog1.FilterIndex = 1;
saveFileDialog1.OverwritePrompt = true;
saveFileDialog1.Title = "Backup SQL File";
if (saveFileDialog1.ShowDialog() == DialogResult.OK)
{
string File = saveFileDialog1.FileName;
Bakfile(File);
}


تابع Bakfile رو هم اينطوري بنويسين:


private void Bakfile(string file)
{
try
{
string sql = @"BACKUP DATABASE Fix TO DISK='" + file + "'";
this.Cursor = Cursors.WaitCursor;
SqlCommand command = null;
SqlConnection connection = null;
connection = Connection.ConnectToFix();// من كانكشن استرينگم رو توي يه كلاس به اسم Connection انداختم. و تابع ConnectToFix رو نوشتم، شما تو اين خط ميتونين كانكشن استرينگتون رو مستقيما درج كنين
if (connection.State != ConnectionState.Open)
connection.Open();
command = new SqlCommand(sql, connection);
command.ExecuteNonQuery();
this.Cursor = Cursors.Default;
MessageBox.Show("بكاپ انجام شد");
}
catch (Exception ex)
{
MessageBox.Show("Error Occurd :" + ex.Message);
}
}


ضمن اينكه توي فرمتون بايد يه saveFileDialog بندازين.
مسلما بعد از گرفتن بكاپ، بايد بازيابي يا همون ري استور هم داشته باشين.
اين كدها رو هم براي ري استور استفاده كنين.
توي كد دكمه ي ري استور:


string strFileName = string.Empty;
openFileDialog1.Filter = @"SQL Backup files (*.BAK) |*.BAK|All files(*.*) |*.*";
openFileDialog1.FilterIndex = 1;
openFileDialog1.Title = "Restore SQL File";
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
strFileName = openFileDialog1.FileName;
Restore(strFileName);

}

و اين هم تابع Restor


private void Restore(string strFileName)
{
try
{
string sql = "ALTER DATABASE Fix SET SINGLE_USER with ROLLBACK IMMEDIATE " +
"use master " +
" RESTORE DATABASE Fix FROM DISK='" + strFileName + "'";
this.Cursor = Cursors.WaitCursor;
SqlCommand command = null;
SqlConnection connection = null;
connection = new SqlConnection("Data Source=.;Initial Catalog=Fix ;Integrated Security=True");
if (connection.State != ConnectionState.Open)
connection.Open();
command = new SqlCommand(sql, connection);

command.ExecuteNonQuery();
this.Cursor = Cursors.Default;
// MessageBox.Show("بازيابي با موفقيت انجام شد");

this.Hide();
}
catch (Exception)
{
LblMsg.Text = "خطا در بازيابي بانك اطلاعاتي، دوباره سعي كنيد";
}

}


بايد يه OpenFileDialog تو برنامه تون بندازين
ضمن اينكه بايد دقت كنين، موقع انجام Restore كانكشن اصلي برنامه تون به ديتابيس رو باز نكرده باشين
در واقع اولين كاري كه كاربر بعد از اجراي برنامه انجام ميده بايد ري استور ديتابيس باشه و وقتي ري استور رو انجام داد، بعدا بتونه مثلا لاگين كنه و ...

موفق باشين.

سلام دوست عزیز.
من از کد پشتیبانگیری شما در برنامم استفاده کردم ولی در هنگام اجرا و وقتی روی دکمه میزنم که پشتیبانگیری کنه این پیغامو میده ؟!!!
http://s4.picofile.com/file/8173758884/error.png

ممنون میشم راهنمایی کنین؛ خیلی کارم سر همین بکاپ و ریستور گیر کرده!!