在做一个网站的时候,需要进行数据库的恢复和备份操作。在本地有sa帐户的情况下,是没有任何问题的,参考的是网上的一段备份恢复代码,数据库连接是肯定没问题的,现在就是把备份和恢复的代码给帖出来,供大家参考下。数据库用的息壤的数据库,是sql2005.在通过程序进行备份的时候,在第一个红色字体部分,提示“您是否有权限”,提示信息不是原来的提示信息,但是肯定是权限的问题,第2个红色部分也是权限问题,第三个提示“路径问题”。但是这三个问题在本地是不存在的,备份恢复都没问题,可以排除代码的问题。
   现在存在的情况,数据库通过程序备份恢复是不行的,错误提示在上面说明了。而通过sqlserver管理器连接到息壤的数据库,使用右键--备份数据库是可以的,但是数据库备份文件只能备份到默认的文件夹路径,也就是sqlserver指定的路径,个人是不能控制的。而息壤不可能提供sa用户或者具有操作master数据库权限的用户,本人得到的用户权限只能是自己的那个数据库。    疑问:手动能备份数据库的话,那通过程序应该也是可以的。现在提示权限的问题,究竟为什么,另外,提示路径的问题,是不是因为没有权限写入文件夹呢?
 public bool BackUpDataBase(Models.DateBaseInf datebaseInf)
        {
            string procname;
            string name = datebaseInf.DB_BackFileName;
            string sql;            conn.Open();        //打开数据库连接            //删除逻辑备份设备,但不会删掉备份的数据库文件
            procname = "sp_dropdevice";
            SqlCommand sqlcmd1 = new SqlCommand(procname, conn);
            sqlcmd1.CommandType = CommandType.StoredProcedure;            SqlParameter sqlpar = new SqlParameter();
            sqlpar = sqlcmd1.Parameters.Add("@logicalname", SqlDbType.VarChar, 50);
            sqlpar.Direction = ParameterDirection.Input;
            sqlpar.Value = datebaseInf.DB_DateBaseName;            try        //如果逻辑设备不存在,略去错误
            {
                sqlcmd1.ExecuteNonQuery();
            }
            catch
            {
            }            //创建逻辑备份设备
            procname = "sp_addumpdevice";
            SqlCommand sqlcmd2 = new SqlCommand(procname, conn);
            sqlcmd2.CommandType = CommandType.StoredProcedure;            sqlpar = sqlcmd2.Parameters.Add("@devtype", SqlDbType.VarChar, 20);
            sqlpar.Direction = ParameterDirection.Input;
            sqlpar.Value = "disk";
            sqlpar = sqlcmd2.Parameters.Add("@logicalname", SqlDbType.VarChar, 20);//逻辑设备名
            sqlpar.Direction = ParameterDirection.Input;
            sqlpar.Value = datebaseInf.DB_DateBaseName;            sqlpar = sqlcmd2.Parameters.Add("@physicalname", SqlDbType.NVarChar, 260);//物理设备名
            sqlpar.Direction = ParameterDirection.Input;
            sqlpar.Value = datebaseInf.DB_BackFileName;
            try
            {
                int i = sqlcmd2.ExecuteNonQuery();            }
            catch (Exception err)
            {
                string str = err.Message;
            }            //备份数据库到指定的数据库文件(完全备份)
            sql = "BACKUP DATABASE " + datebaseInf.DB_DateBaseName + " TO disk='" +System.Web.HttpContext.Current.Server.MapPath("~/Manage/DateBaseBak/")+ datebaseInf.DB_BackFileName + "' WITH INIT";
            SqlCommand sqlcmd3 = new SqlCommand(sql, conn);
            sqlcmd3.CommandType = CommandType.Text;
            try
            {
                sqlcmd3.ExecuteNonQuery();
                string sqlstr = "Proc_BackUpDB";
                SqlParameter[] values = new SqlParameter[]{
                 new SqlParameter("@DateBaseName",datebaseInf.DB_DateBaseName),
                 new SqlParameter("@BackFileName",datebaseInf.DB_BackFileName),
                 new SqlParameter("@LoginName",datebaseInf.UserInfo.U_LoginName)
                };
            SQLHelper.ExecuteCommand(sqlstr, CommandType.StoredProcedure, values);
            }
            catch (Exception err)
            {
                string str = err.Message;
                conn.Close();                return false;
            }            conn.Close();//关闭数据库连接
            return true;        }        /// <summary>
        /// 还原指定的数据库文件
        /// </summary>
        /// <param name="databasename">要还原的数据库</param>
        /// <param name="databasefile">数据库备份文件及路径</param>
        /// <returns></returns>
        public bool RestoreDataBase(Models.DateBaseInf datebaseInf)
        {            //还原指定的数据库文件
            string sql1 = "RESTORE DATABASE " + datebaseInf.DB_DateBaseName + " from DISK = '" +System.Web.HttpContext.Current.Server.MapPath("~/Manage/DateBaseBak/")+ datebaseInf.DB_BackFileName + "'With Replace";
            SqlCommand sqlcmd = new SqlCommand(sql1, conn);
            sqlcmd.CommandType = CommandType.Text;            conn.Open();
            string procname = "killspid";
            SqlCommand sqlcmd1 = new SqlCommand(procname, conn);
            sqlcmd1.CommandType = CommandType.StoredProcedure;            SqlParameter sqlpar = new SqlParameter();
            sqlpar = sqlcmd1.Parameters.Add("@dbname", "De_Employ");
           
            sqlpar.Direction = ParameterDirection.Input;
            sqlpar.Value = datebaseInf.DB_DateBaseName;            try        //如果逻辑设备不存在,略去错误
            {
                sqlcmd1.ExecuteNonQuery();
            }
            catch
            {
            }
            try
            {
                sqlcmd.ExecuteNonQuery();
                /*
                 string sqlstr = "Proc_ResDoreDB";
                 SqlParameter[] values = new SqlParameter[]{
                 new SqlParameter("@DateBaseName",datebaseInf.DB_DateBaseName),
                 new SqlParameter("@BackFileName",datebaseInf.DB_BackFileName),
                 new SqlParameter("@LoginName",datebaseInf.UserInfo.U_LoginName)
                };
             SQLHelper.ExecuteCommand(sqlstr, CommandType.StoredProcedure, values);
                 * */
            }
            catch (Exception err)
            {
                string str = err.Message;
                conn.Close();                return false;
            }            conn.Close();//关闭数据库连接
            return true;
        }