PDA

View Full Version : تهیه نسخه پشتیبان توسط برنامه از sql server 2008



alimooghashang
جمعه 21 مهر 1391, 17:02 عصر
سلام
من داخل برنامه ام میخوام یه امکانی بذارم که کاربر بتونه از دیتابیس sql server یه بک آپ بگیره و بتونه همون رو restore کنه
حجم دیتابیس هم در ماه تقریبا 500 مگ میشه!
ممنون

veniz2008
جمعه 21 مهر 1391, 17:31 عصر
سلام. قبلا در تاپیک زیر هم بک آپ و هم ری استور رو بصورت کامل توضیح دادم.
http://barnamenevis.org/showthread.p...A7%D9%86/page2 (http://barnamenevis.org/showthread.php?348780-%DA%86%DA%AF%D9%88%D9%86%DA%AF%DB%8C-%D8%AA%D9%87%DB%8C%D9%87-%DA%A9%D9%BE%DB%8C-%D8%A7%D8%B2-%D9%81%D8%A7%DB%8C%D9%84-%D9%87%D8%A7%DB%8C-%D8%AF%DB%8C%D8%AA%D8%A7%D8%A8%DB%8C%D8%B3-%D8%A8%D9%87-%D9%85%D9%86%D8%B8%D9%88%D8%B1-%D8%AA%D9%87%DB%8C%D9%87-%D9%BE%D8%B4%D8%AA%DB%8C%D8%A8%D8%A7%D9%86/page2)
فقط یه نکته میمونه اونم در مورد حجم دیتابیسی هست که میخوای بک آپ بگیری. این کار در عمل مشخص میشه. اما توصیه میکنم که از شی backgroundworker استفاده کنید. این شی کاربردش برای زمانهایی هست که میخواید اعمال سنگین و زمانبری رو انجام بدید که باعث میشه برنامه شما همون روند آرام و روان خودش رو حفظ کنه.یاد گرفتنش هم چند دقیقه ای بیشتر وقت نمیگیره.
موفق باشی دوست من.

roolinjax
جمعه 21 مهر 1391, 17:36 عصر
با سلام
قبلا خودم این سوال رو جواب داده بودم ، اگر سرچ می زدین حتما پیدا می کردین :
http://barnamenevis.org/showthread.php?360802-%D9%85%D8%B4%DA%A9%D9%84-%D8%A8%D8%A7-%D8%A8%DA%A9-%D8%A7%D9%BE%DA%AF%DB%8C%D8%B1%DB%8C-%D9%84%D8%AA-c&p=1592238#post1592238

alimooghashang
جمعه 21 مهر 1391, 17:42 عصر
با سلام
قبلا خودم این سوال رو جواب داده بودم ، اگر سرچ می زدین حتما پیدا می کردین :


یعنی بهمین راحتی؟

با سلام
گرچه این مطلب تکراریه اما اینم کد های مورد نظر :
بکاپ :
SqlConnection sq = new SqlConnection("Data Source=.;Integrated Security=True");
SaveFileDialog sfd = new SaveFileDialog();
sfd.Filter = "*.bak|*.bak";
if (sfd.ShowDialog() == DialogResult.OK)
{
SqlCommand com = new SqlCommand("backup database " + txtDBName + " to disk='"
+sfd.FileName + "'", sq);
sq.Open();
com.ExecuteNonQuery();
sq.Close();
}//
کد بازیابی :
SqlConnection sq = new SqlConnection("Data Source=.;Integrated Security=True");
OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = "*.bak|*.bak";
if (ofd.ShowDialog() == DialogResult.OK)
{
string query = "USE [master]; RESTORE DATABASE [" + txtDBName.Text + "] FROM DISK =
N'" +ofd.FileName + " ' WITH FILE = 1, NOUNLOAD, REPLACE, STATS = 10";
SqlCommand com = new SqlCommand(query, sq);
sq.Open();
com.ExecuteNonQuery();
sq.Close();
}//


مشکل حجم دیتابیس چیزی نیس؟

alimooghashang
جمعه 21 مهر 1391, 17:48 عصر
ببخشید این فایل لاگ چیه که انقدر حجمش زیاده!
مثلا الان mdf من 135 مگ شده فایل log ش 1 گیگ ه

alimooghashang
جمعه 21 مهر 1391, 17:50 عصر
فقط یه نکته میمونه اونم در مورد حجم دیتابیسی هست که میخوای بک آپ بگیری. این کار در عمل مشخص میشه. اما توصیه میکنم که از شی backgroundworker استفاده کنید. این شی کاربردش برای زمانهایی هست که میخواید اعمال سنگین و زمانبری رو انجام بدید که باعث میشه برنامه شما همون روند آرام و روان خودش رو حفظ کنه.یاد گرفتنش هم چند دقیقه ای بیشتر وقت نمیگیره.
میشه یک نمونه مثال از backgroundworker رو بهم نشون بدید که بدونم چطوری باید این کار رو انجام بدم؟
ممنون

roolinjax
جمعه 21 مهر 1391, 18:30 عصر
مشکل حجم دیتابیس چیزی نیس؟

می تونید تست کنید و ببینید.
برای بک گراند ورکر هم می تونید کد بکاپ گیری رو داخل رویداد backgroundWorker1_DoWork قرار بدین و در رویداد backgroundWorker1_RunWorkerCompleted پیغام بدین که عملیات با موفقیت انجام شد.
فقط باید خط زیر رو هم برای دکمه ی پشتیبان گیری بذارین :
backgroundWorker1.RunWorkerAsync();
موفق باشید

veniz2008
جمعه 21 مهر 1391, 18:33 عصر
در لینک زیر قبلا یه مثال رو بصورت کامل توضیح دادم :
http://barnamenevis.org/showthread.php?355332-%D8%AA%D9%85%D8%A7%D9%85-%D8%B4%D8%AF%D9%86-%D8%B2%D9%85%D8%A7%D9%86-%D8%A7%D9%86%D8%AC%D8%A7%D9%85-%D8%AF%D8%A7%D8%AF%D9%86-%D9%BE%D8%B1%D8%B3-%D9%88%D8%AC%D9%88-%D8%AF%D8%B1-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D8%A7%D9%85&highlight=backgroundworker
موفق باشید.

alimooghashang
جمعه 21 مهر 1391, 18:49 عصر
Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.

veniz2008
جمعه 21 مهر 1391, 18:53 عصر
Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.

این خطا زمانی رخ میده که در زمان معین، عمل مورد نظر انجام نمیشه. اگر امکانش هست کدهایی رو که نوشتی بذار تا یه نگاه بکنیم.

alimooghashang
جمعه 21 مهر 1391, 18:59 عصر
این خطا زمانی رخ میده که در زمان معین، عمل مورد نظر انجام نمیشه. اگر امکانش هست کدهایی رو که نوشتی بذار تا یه نگاه بکنیم.

SqlConnection sq = new SqlConnection("Data Source=.;Integrated Security=True");
SaveFileDialog sfd = new SaveFileDialog();
sfd.Filter = "*.bak|*.bak";
if (sfd.ShowDialog() == DialogResult.OK)
{
SqlCommand com = new SqlCommand("backup database " + txtDBName + " to disk='"
+sfd.FileName + "'", sq);
sq.Open();
com.ExecuteNonQuery();
sq.Close();
}

veniz2008
جمعه 21 مهر 1391, 19:16 عصر
کانکشن رو اشتباه نوشتی، یعنی نام دیتابیس رو بهش ندادی.

SqlConnection sq = new SqlConnection("Data Source=.;Initial catalog = databaseName;Integrated Security=True");

roolinjax
جمعه 21 مهر 1391, 19:19 عصر
البته ممکنه از نام دیتابیسی که وارد میشه هم باشه.
خط پنجم باید به جای txtDBName نام دیتابیس رو بذاری ، اونم با پسوند

alimooghashang
جمعه 21 مهر 1391, 19:37 عصر
البته ممکنه از نام دیتابیسی که وارد میشه هم باشه.
خط پنجم باید به جای txtDBName نام دیتابیس رو بذاری ، اونم با پسوند

SqlCommand com = new SqlCommand("backup database mydb.mdf to disk='" + sfd.FileName + "'", sq);

ارر میده

Incorrect syntax near '.'.

roolinjax
جمعه 21 مهر 1391, 19:42 عصر
SqlCommand com = new SqlCommand("backup database mydb.mdf to disk='" + sfd.FileName + "'", sq);

ارر میده

Incorrect syntax near '.'.

با نهایت شرمندگی ، پسوند رو بردارید !!!!!
فقط نام دیتابیس باشه کافیه.
اگر نشد ارورشو بهم بگین . ولی بعید می دونم دیگه ارور داشته باشه.

alimooghashang
جمعه 21 مهر 1391, 19:48 عصر
با نهایت شرمندگی ، پسوند رو بردارید !!!!!
فقط نام دیتابیس باشه کافیه.
اگر نشد ارورشو بهم بگین . ولی بعید می دونم دیگه ارور داشته باشه.



Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.

roolinjax
جمعه 21 مهر 1391, 19:54 عصر
این دیگه کد خودمه که واسه آخرین پروژه ام زدم.
SqlConnection connect;
string con = System.Configuration.ConfigurationSettings.AppSett ings["cnn"];
connect = new SqlConnection(con);
connect.Open();
SqlCommand command;
command = new SqlCommand(@"backup database mydb to disk ='" + strFileName + "' with init,stats=10", connect);
command.ExecuteNonQuery();
connect.Close();
کانکشنم هم توی فایل کانفیگه که متنش به این شکله
Data Source=.\SQLExpress;Initial Catalog=mydb;Integrated Security=True
خدایا رو سفیدم کن !!!!!
سریع تست کن ، جوابمو بده

alimooghashang
جمعه 21 مهر 1391, 19:57 عصر
نکنه باید داخل sql server تنظیم خاصی رو انجام بدیم؟

roolinjax
جمعه 21 مهر 1391, 20:02 عصر
نکنه باید داخل sql server تنظیم خاصی رو انجام بدیم؟

نه بابا این حرفا چیه ؟
اون تاپیکی هم که بهتون گفتم رو که دیدین ؟ بچه های دیگه جواب گرفته بودن
دیتابیستون رو باز نذارید و تست کنید
خط زیر رو هم به اول کدتون اضافه کنید تا تمام کانکشن های باز بسته بشه. دقت کنید (بالای همه دستورات ، اول اول )
SqlConnection.ClearAllPools();

alimooghashang
دوشنبه 01 آبان 1391, 18:18 عصر
Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.
The backup or restore was aborted.


بازم نشد

veniz2008
دوشنبه 01 آبان 1391, 21:35 عصر
حجم پایگاه داده ات چقدره؟. حجم زیادی رو میخوای بک اپ بگیری؟. یه کم بیشتر توضیح بده.

alimooghashang
دوشنبه 01 آبان 1391, 21:48 عصر
حجم پایگاه داده ات چقدره؟. حجم زیادی رو میخوای بک اپ بگیری؟. یه کم بیشتر توضیح بده.

حجم که روز به روز زیادتر میشه
مثلا ما میخواهیم ماهیانه بک آپ بگیریم و حجمش تقریبا 1 گیگ میشه
الان 200 مگ ه

alimooghashang
یک شنبه 21 آبان 1391, 14:46 عصر
خواهشا یکی کمک کنه! :ناراحت: