علی فتحی
دوشنبه 27 مهر 1394, 20:22 عصر
با عرض سلام و خسته نباشید.بنده برای هر سال مالی در مسیر برنامه یک بک اپ از دیتابیس گرفتم با نام سال مربوطه ذخیره کردم هنگام استفاده با یک کمبو باکس سال مربوطه رو انتخاب میکنم .سوالم اینه چگونه بک اپ مربوطه را مرتب رفرش کنم. مثلا اگر سال مالی 1394 رو ایجاد کردم یک نمونه در مسیر برنامه بنام 1394.mdf ایجاد میکنم حالا میخواهم عملیاتی که در ذخیره دیتابیس وارد میشه مرتب در بک اپ مربوطه هم وارد بشه.
----- البته با time اینکارو کردم هر 5 دقیقه یک بک اپ بگیره ولی مشکل اینجاست بک اپ گیری کند و چند ثانیه برنامه را متوقف میکنه واین یعنی ضعف نرم افزار.
2-یک راه دیگر هم رفتم اونم کل دیتابیس رو در پوشه بانام سال گذاشتم راحت با کمبو باکس پوشه مربوطه را انتخاب و بادیتابیس کار میکنم و این وقتی کاربرد داره که دیتا بیس در مسیر برنامه باشه .فکر بالا بخاطر این به نظرم اومده میخوام دیتابیس رو لوکال کنم و قطعا این روش 2 در لوکال جواب نمیده .
try {
if (System.IO.File.Exists(Application.StartupPath + "\\Sal\\" + textBoxX1.Text + ".mdf"))
{
MessageBox.Show("این سال وجود دارد");
}
else
{
SqlCommand cmd = new SqlCommand();
cmd.Connection = new SqlConnection("Data Source=.\\SQLEXPRESS;AttachDbFilename=|DataDirecto ry|Data\\Datn.mdf;Integrated Security=True;Connect Timeout=10;User Instance=True");
cmd.Connection.Open();
string dbname = cmd.Connection.Database;//'گرفتن نام کامل دیتابیس
cmd.Connection.Close();
SqlConnection.ClearAllPools();
string query = "BACKUP DATABASE [" + dbname + "] TO DISK ='" + Application.StartupPath + "\\Sal\\" + textBoxX1.Text + ".mdf'";
cmd.Connection = new SqlConnection("Data Source=.\\sqlexpress;Integrated Security=True;Connect Timeout=30;User Instance=True");
cmd.Connection.Open();
cmd.CommandText = query;
cmd.ExecuteNonQuery();
cmd.Connection.Close();
progressBarX1.PerformStep();
progressBarX1.Value = 0;
progressBarX1.Value = 100;
MessageBox.Show("سال مالی ایجاد شد");
}
try {
SqlCommand cmd = new SqlCommand();
cmd.Connection = new SqlConnection("Data Source=.\\SQLEXPRESS;AttachDbFilename=|DataDirecto ry|Data\\Datn.mdf;Integrated Security=True;Connect Timeout=10;User Instance=True");
cmd.Connection.Open();
string dbname = cmd.Connection.Database;
cmd.Connection.Close();
string query = "ALTER DATABASE [" + dbname + "] SET SINGLE_USER WITH ROLLBACK IMMEDIATE ;RESTORE DATABASE [" + dbname + "] FROM DISK = '" + Application.StartupPath + "\\Sal\\" + textBoxX2.Text + ".mdf';ALTER DATABASE [" + dbname + "] SET MULTI_USER ;";
cmd.Connection = new SqlConnection("Data Source=.\\sqlexpress;Integrated Security=True;Connect Timeout=30;User Instance=True");
cmd.Connection.Open();
cmd.CommandText = query;
cmd.ExecuteNonQuery();
cmd.Connection.Close();
progressBarX1.PerformStep();
progressBarX1.Value = 100;
progressBarX1.Value = 0;
MessageBox.Show("سال مالی انتخاب شد");
----- البته با time اینکارو کردم هر 5 دقیقه یک بک اپ بگیره ولی مشکل اینجاست بک اپ گیری کند و چند ثانیه برنامه را متوقف میکنه واین یعنی ضعف نرم افزار.
2-یک راه دیگر هم رفتم اونم کل دیتابیس رو در پوشه بانام سال گذاشتم راحت با کمبو باکس پوشه مربوطه را انتخاب و بادیتابیس کار میکنم و این وقتی کاربرد داره که دیتا بیس در مسیر برنامه باشه .فکر بالا بخاطر این به نظرم اومده میخوام دیتابیس رو لوکال کنم و قطعا این روش 2 در لوکال جواب نمیده .
try {
if (System.IO.File.Exists(Application.StartupPath + "\\Sal\\" + textBoxX1.Text + ".mdf"))
{
MessageBox.Show("این سال وجود دارد");
}
else
{
SqlCommand cmd = new SqlCommand();
cmd.Connection = new SqlConnection("Data Source=.\\SQLEXPRESS;AttachDbFilename=|DataDirecto ry|Data\\Datn.mdf;Integrated Security=True;Connect Timeout=10;User Instance=True");
cmd.Connection.Open();
string dbname = cmd.Connection.Database;//'گرفتن نام کامل دیتابیس
cmd.Connection.Close();
SqlConnection.ClearAllPools();
string query = "BACKUP DATABASE [" + dbname + "] TO DISK ='" + Application.StartupPath + "\\Sal\\" + textBoxX1.Text + ".mdf'";
cmd.Connection = new SqlConnection("Data Source=.\\sqlexpress;Integrated Security=True;Connect Timeout=30;User Instance=True");
cmd.Connection.Open();
cmd.CommandText = query;
cmd.ExecuteNonQuery();
cmd.Connection.Close();
progressBarX1.PerformStep();
progressBarX1.Value = 0;
progressBarX1.Value = 100;
MessageBox.Show("سال مالی ایجاد شد");
}
try {
SqlCommand cmd = new SqlCommand();
cmd.Connection = new SqlConnection("Data Source=.\\SQLEXPRESS;AttachDbFilename=|DataDirecto ry|Data\\Datn.mdf;Integrated Security=True;Connect Timeout=10;User Instance=True");
cmd.Connection.Open();
string dbname = cmd.Connection.Database;
cmd.Connection.Close();
string query = "ALTER DATABASE [" + dbname + "] SET SINGLE_USER WITH ROLLBACK IMMEDIATE ;RESTORE DATABASE [" + dbname + "] FROM DISK = '" + Application.StartupPath + "\\Sal\\" + textBoxX2.Text + ".mdf';ALTER DATABASE [" + dbname + "] SET MULTI_USER ;";
cmd.Connection = new SqlConnection("Data Source=.\\sqlexpress;Integrated Security=True;Connect Timeout=30;User Instance=True");
cmd.Connection.Open();
cmd.CommandText = query;
cmd.ExecuteNonQuery();
cmd.Connection.Close();
progressBarX1.PerformStep();
progressBarX1.Value = 100;
progressBarX1.Value = 0;
MessageBox.Show("سال مالی انتخاب شد");