using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Data.SqlClient;

public partial class Report_DateProtect : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }
    protected void btnCopy_Click(object sender, EventArgs e)
    {
        try
        {
            string backupFolder = System.IO.Path.Combine(Request.PhysicalApplicationPath, "data");
            if (!System.IO.Directory.Exists(backupFolder))//判断文件夹是否存在 
            {
                //创建文件夹 
                System.IO.Directory.CreateDirectory(backupFolder);
            }
            string backupFileName = System.IO.Path.Combine(backupFolder, DateTime.Today.ToString("yyyyMMdd.bak"));

            string sqltxt = string.Format("BACKUP DATABASE zzgcp TO DISK='{0}'", backupFileName);
            SqlConnection conn = new SqlConnection();
            conn.ConnectionString = "server=.;uid=sa;pwd=sa;database=zzgcp";
            conn.Open();
            SqlCommand cmd = new SqlCommand(sqltxt, conn);
            cmd.ExecuteNonQuery();
            conn.Close();
            //MessageBox.Show("备份成功", "提示", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
            Response.Write("<script>alert('备份成功!')</script>");
            //this.Close();
        }
        catch
        {
            throw;
        }
    }
    protected void btnHuanyuan_Click(object sender, EventArgs e)
    {
        if (FileUpload1.FileName=="")
        {
            Response.Write("<script>alert('请选择要还原的文件!')<script>");
        }
        else
        {
         
           
            string url =  FileUpload1.FileName;
            RestoreDatabase(Server.MapPath("../data") + "\\" + url);
        }
    }

    public void RestoreDatabase(string backfile)
    {

        ///杀死原来所有的数据库连接进程

        SqlConnection conn = new SqlConnection();

        conn.ConnectionString = "Data Source=.;Initial Catalog=master;User ID=sa;pwd =sa";

        conn.Open();

        string sql = "SELECT spid FROM sysprocesses ,sysdatabases WHERE sysprocesses.dbid=sysdatabases.dbid AND sysdatabases.Name='" +

                      "zzgcp" + "'";

        SqlCommand cmd1 = new SqlCommand(sql, conn);

        SqlDataReader dr;

        ArrayList list = new ArrayList();

        try
        {

            dr = cmd1.ExecuteReader();

            while (dr.Read())
            {

                list.Add(dr.GetInt16(0));

            }

            dr.Close();

        }

        catch (SqlException eee)
        {

            throw;

        }

        finally
        {

            conn.Close();

        }

        //MessageBox.Show(list.Count.ToString());

        for (int i = 0; i < list.Count; i++)
        {

            conn.Open();

            cmd1 = new SqlCommand(string.Format("KILL {0}", list[i].ToString()), conn);

            cmd1.ExecuteNonQuery();

            conn.Close();

            //MessageBox.Show("系统已经清除的数据库线程: " + list[i].ToString() + "\r\n正在还原数据库!");
            Response.Write("<script>alert('系统已经清除的数据库线程')</script>" + list[i].ToString() + "\\r\\n正在还原数据库!");

        }

        //这里一定要是master数据库,而不能是要还原的数据库,因为这样便变成了有其它进程

        //占用了数据库。

        string constr = @"Data Source=.;Initial Catalog=master;User ID=sa;pwd =sa";

        string database = "zzgcp";

        string path = backfile;

        //database是要还原数据库的名字,与备份的数据库结构必需一样,
        if (conn.State == ConnectionState.Open)
        {
            conn.Close();
        }

        string BACKUP = String.Format("RESTORE DATABASE {0} FROM DISK = '{1}'", database, path);

        SqlConnection con = new SqlConnection(constr);

        SqlCommand cmd = new SqlCommand(BACKUP, con);

        con.Open();

        try
        {

            cmd.ExecuteNonQuery();


            //MessageBox.Show("还原成功,点击退出系统!");
            Response.Write("<script>alert('还原成功,点击退出系统!')</script>");




        }

        catch (SqlException ee)
        {
            throw;
            //throw(ee);

            //MessageBox.Show("还原失败");
            //Response.Write("<script>alert('还原失败!')</script>");
            Response.Write("<script>alert('还原失败,点击退出系统!')</script>");



        }

        finally
        {

            con.Close();

        }
        SqlConnection.ClearAllPools(); 
     //如不加这句会有错误:在向服务器发送请求时发生传输级错误。 provider 共享内存提供程序 error 0 管道的另一端上无任何进程。 


    }


}