在做一个网站的时候,需要进行数据库的恢复和备份操作。在本地有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;
}
现在存在的情况,数据库通过程序备份恢复是不行的,错误提示在上面说明了。而通过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;
}
解决方案 »
- Windows Mobile中使用WCF数据量大是返回为空的问题!
- winForm 程序 如何实现打印和打印预览datagridView吖
- vs编译好使,用浏览器访问iis虚拟目录,报Cannot find table 0....
- C#的界面布局问题
- 还是一个简单的问题
- 多线程调试的问题
- 自己写的一个基于SMTP邮件发送程序,能发送出去,被接受服务器拒绝,是什么原因?
- 若何在.net中通过程序自动获取客户端打印机型号(C#语言)
- c#如何发ARP数据包?
- 调用winapi32函数读取串口疑问?
- [求助]C# Winform中Form1和UserControl1之间怎么传值?
- C#中如何在一个类里访问主窗体中的控件
至于路径一个是写入权限,一个是到底存在不?
只要提高用户的权限,不然就算你可以备份,恢复是肯定不行的