PDA

View Full Version : کمک در کد ریستور این برنامه



sky_man847
جمعه 08 اسفند 1393, 13:28 عصر
با سلام دوستان من کد بکاپ و ریستوری رو نوشتم قسمت بکاپ بخوبی کار میکنه ولی قسمت ریستور دکمه ریستور رو میزنم عملیات کامل نمیشه ممنون میشم کمکی کنینusing System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;
using System.IO;

namespace MyAzmoon
{
public partial class FrmBackupandRestor : Form
{
SqlConnection con = new SqlConnection("server=.\\AYHAN;DataBase=Zamin;Integrated Security=True;Asynchronous Processing=true");
SqlCommand cmd;
bool flag = false;

public FrmBackupandRestor()
{
InitializeComponent();
}

private void إBtnSelectPath_Click(object sender, EventArgs e)
{
if (folderBrowserDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
if (folderBrowserDialog1.SelectedPath.Substring(0, 1) == "C")
MessageBox.Show("بهتر است مسیری غیر از درایو/n" + "C/n" + "را برای فایل پشتیبان انتخاب نمایید");
if (folderBrowserDialog1.SelectedPath.Length > 350)
MessageBox.Show("مسیری که انتخال کردید بیش از 350 کارکتر میباشد");
else
{
TxtSelectPath.Text = folderBrowserDialog1.SelectedPath;
}
}
}

private void BtnBackup_Click(object sender, EventArgs e)
{
if (string.IsNullOrWhiteSpace(TxtSelectPath.Text))
errorProvider1.SetError(TxtSelectPath, "جای خالی را پر کنید");
else if (string.IsNullOrWhiteSpace(TxtBackupName.Text))
errorProvider1.SetError(TxtBackupName, "وارد کنید");
else if (File.Exists(TxtSelectPath.Text + "\\" + TxtBackupName.Text.Trim() + ".bak"))
MessageBox.Show("در مسیر انتخاب شده قبلا یک فایل با همین نام ذخیره شده است");
else
{
flag = true;
GrpSelct.Enabled = false;
BtnBackup.Enabled = false;
cmd = new SqlCommand("MyBackup", con);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@path", TxtSelectPath.Text + "\\" + TxtBackupName.Text.Trim() + ".bak");
con.Open();
AsyncCallback CallBackDeletgate = HandleCallBack;

cmd.BeginExecuteNonQuery(CallBackDeletgate, cmd);
}

}
//
private void HandleCallBack(IAsyncResult result)
{
try
{
cmd = (SqlCommand)result.AsyncState;
cmd.EndExecuteNonQuery(result);
MessageBox.Show("پشتیبانگیری انجام شد");
}
catch (Exception ex)
{
MessageBox.Show("متوقف شد");
}
con.Close();
flag = false;
this.BeginInvoke((MethodInvoker)delegate()
{
BtnBackup.Enabled = true;
GrpSelct.Enabled = true;
});
}
private void BtnCancel_Click(object sender, EventArgs e)
{
cmd.Cancel();
}

private void RdbBackup_CheckedChanged(object sender, EventArgs e)
{
GrpBackup.Enabled = true;
GrpRestore.Enabled = false;

}

private void Rdbrestore_CheckedChanged(object sender, EventArgs e)
{
GrpBackup.Enabled = false;
GrpRestore.Enabled = true;


}

private void FrmBackupandRestor_FormClosing(object sender, FormClosingEventArgs e)
{
if(RdbBackup.Checked==true) {
if (flag == true)
{
e.Cancel = true;
MessageBox.Show("لطفا ابتدا عملیات را متوقف کنید سپس اقدام به خروج نمایید");

}
}


else if(Rdbrestore.Checked==true)
{
if(flag==true)
e.Cancel = false;
MessageBox.Show(".شما در حال بازیابی اطلاعات میباشداکیدا توصیه میکنیم تا پایان عملیات پروژه را نبندین");
}}

private void BtnSelectBackup_Click(object sender, EventArgs e)
{
openFileDialog1.Filter = "(*.bak)|*.bak";
if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
TxtSelectBackup.Text = openFileDialog1.FileName;
}

private void BtnRestore_Click(object sender, EventArgs e)
{
if (string.IsNullOrWhiteSpace(TxtSelectBackup.Text))
errorProvider1.SetError(TxtSelectBackup, "فایل پشتیبان انتخاب کنید");
else
{
flag = true;
GrpSelct.Enabled = false;
BtnRestore.Enabled = false;
if (backgroundWorker1.IsBusy)
{
backgroundWorker1.RunWorkerAsync();

}
}
}

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
cmd = new SqlCommand("MyRestore", con);

cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@pathfile", TxtSelectBackup.Text.Trim());
con.Open();
cmd.ExecuteNonQuery();
con.Close();
}

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Error == null)
{
MessageBox.Show(".عملیات با موفقیت انجام شد. برنامه بعد از این پیغام ریستارت خواهد شد");
Application.Restart();
}
else
{
MessageBox.Show("در بازیابی اطلاعات خطایی رخ داده است");
flag = false;
}
}
}
}

majjjj
یک شنبه 10 اسفند 1393, 10:07 صبح
لطفا برنامه را بزارید دوستان چک کنن

Mofid.m
یک شنبه 10 اسفند 1393, 21:37 عصر
شما کد SQL رو بزار
اما من یه کد SQL بهت میدم.

alter database MyDB set offline with rollback immediate
restore database MyDB from disk=@path with replace
alter database MyDB set online

حدس من اینه که شما هم تقریبا عین این کد رو نوشتی
حتما از Stored Procedure هم استفاده کردی
چک کن که پارامتر path رو nvarchar تعریف کرده باشی و MAX هم نباشه، محدودش کن.
اگه نشد
کد اس کیو ال رو هم بزار...

sky_man847
یک شنبه 10 اسفند 1393, 22:05 عصر
شما کد SQL رو بزار
اما من یه کد SQL بهت میدم.

alter database MyDB set offline with rollback immediate
restore database MyDB from disk=@path with replace
alter database MyDB set online


حدس من اینه که شما هم تقریبا عین این کد رو نوشتی
حتما از Stored Procedure هم استفاده کردی
چک کن که پارامتر path رو nvarchar تعریف کرده باشی و MAX هم نباشه، محدودش کن.
اگه نشد
کد اس کیو ال رو هم بزار...

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

USE [zamin]
GO
/****** Object: StoredProcedure [dbo].[MyRestore] Script Date: 3/1/2015 10:42:49 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER proc [dbo].[MyRestore]
@pathfile nvarchar(400)
as
alter database zamin set offline with rollback immediate
restore database zamin from disk=@pathfile with replace
alter database zamin set online

Mofid.m
یک شنبه 10 اسفند 1393, 22:23 عصر
شما بیا یبار توی کد برنامه اونجایی که


if (backgroundWorker1.IsBusy)
{
backgroundWorker1.RunWorkerAsync();

}


بنویس


if (!backgroundWorker1.IsBusy)
{
backgroundWorker1.RunWorkerAsync();

}

Mofid.m
یک شنبه 10 اسفند 1393, 22:29 عصر
یعنی بیا تابع RunWorkerAsync رو زمانی اجرا کن که مشغول نبود
شما هیچوقت تو برنامت بک گراند ورکر مشغول نمیشه.
یعنی میتونستی چک نکنی
اما حالا که داری چک میکنی زمانی اون تابع رو اجرا کن که مشغول انجام کاری نباشه.

Mofid.m
یک شنبه 10 اسفند 1393, 23:44 عصر
شما بهتر یه سری بررسی هایی رو هم انجام بدی
بیا چک کن آدرس فایل پشتیبانی که کاربر داده درسته یا نه.
شاید کاربر آدرس فایل رو بده و بعد فایل رو پاک کنه و بعد پشتیبان گیری رو بزنه...
تمام احتمالات رو برسی کن بعد شرع کن به Restore کردن.
در غیر این صوت پایگاه داده برنامه دچار مشکل میشه و شما مجبوری دوباره بسازیش.
البته برای ساختنش هم نیاز نیست کل دیتابیس رو بسازی
فقط یه دیتابیس خالی و یه استور پروسیجور برای بازیابی.

h.gheidrlou
سه شنبه 17 اسفند 1395, 01:16 صبح
من برای ریستور کردن به این مشکل برخوردم لطفا راهنمایی کنید