C#.NET SQL数据库备份/还原问题

小弟在搞网站后台管理系统开发,遇到点小问题,请各位大侠不吝赐教,十分感激!是这样的,在后台代码里,对当前正在使用的数据库进行备份是容易的,但是要还原(即覆盖当前数据库)时... 小弟在搞网站后台管理系统开发,遇到点小问题,请各位大侠不吝赐教,十分感激!是这样的,在后台代码里,对当前正在使用的数据库进行备份是容易的,但是要还原(即覆盖当前数据库)时便有问题了, 错误提示:“因为数据库正在使用,所以无法获得对数据库的独占访问权。 RESTORE DATABASE 正在异常终止。已将数据库上下文更改为 'master'。 ” 数据库会存在排他性访问的问题。我查了一下,好像要先杀死所有与当前数据库相关的进程后才能还原,但是具体怎么做呢?一个搞网站的朋友告诉我用“DUMP TRANSACTION 数据库名 WITH NO_LOG”指令解决,但是问题也没有得到解决。如果哪位大侠有项目例子给我发个来 ,就更好了,只要包含C#.NET下SQL数据库还原/备份的例子就行。 展开
 我来答
匿名用户
2013-07-07
展开全部
需要注意的时还原,还原的时候问题最大了,有别的用户使用数据库的时候无法还原,解决办法就是在MASTER数据库中添加一个存储过程(结束进程):
  
  create proc killspid (@dbname varchar(20))
  as
  begin
  declare @sql nvarchar(500)
  declare @spid int
  set @sql='declare getspid cursor for
  select spid from sysprocesses where dbid=db_id('''+@dbname+''')'
  exec (@sql)
  open getspid
  fetch next from getspid into @spid
  while @@fetch_status<>-1
  begin
  exec('kill '+@spid)
  fetch next from getspid into @spid
  end
  close getspid
  deallocate getspid
  end
  GO
  
  在还原之前先执行这个存储过程,需要传递dbname,就是你的数据库的名字。下边是类的原代码:(web.config里的数据库连接字符串是constr)
  
  using System;
  
  using System.Configuration;
  
  using System.Data.SqlClient;
  
  using System.Data;
  
  namespace web.base_class
  
  {
  
  /// <summary>
  
  /// DbOper类,主要应用SQLDMO实现对Microsoft SQL Server数据库的备份和恢复
  
  /// </summary>
  
  public class DbOper
  
  {
  
  private string server;
  
  private string uid;
  
  private string pwd;
  
  private string database;
  
  private string conn;
  
  /// <summary>
  
  /// DbOper类的构造函数
  
  /// </summary>
  
  public DbOper()
  
  {
  
  conn=System.Configuration.ConfigurationSettings.AppSettings["constr"].ToString();
  
  server=cut(conn,"server=",";");
  
  uid=cut(conn,"uid=",";");
  
  pwd=cut(conn,"pwd=",";");
  
  database=cut(conn,"database=",";");
  
  }
  
  public string cut(string str,string bg,string ed)
  
  {
  
  string sub;
  
  sub=str.Substring(str.IndexOf(bg)+bg.Length);
  
  sub=sub.Substring(0,sub.IndexOf(";"));
  
  return sub;
  
  }
  
  
  
  /// <summary>
  
  /// 数据库备份
  
  /// </summary>
  
  public bool DbBackup(string url)
  
  {
  
  SQLDMO.Backup oBackup = new SQLDMO.BackupClass();
  
  SQLDMO.SQLServer oSQLServer = new SQLDMO.SQLServerClass();
  
  try
  
  {
  
  oSQLServer.LoginSecure = false;
  
  oSQLServer.Connect(server,uid, pwd);
  
  oBackup.Action = SQLDMO.SQLDMO_BACKUP_TYPE.SQLDMOBackup_Database;
  
  oBackup.Database = database;
  
  oBackup.Files = url;//"d:\Northwind.bak";
  
  oBackup.BackupSetName = database;
  
  oBackup.BackupSetDescription = "数据库备份";
  
  oBackup.Initialize = true;
  
  oBackup.SQLBackup(oSQLServer);
  
  return true;
  
  }
  
  catch
  
  {
  
  return false;
  
  throw;
  
  }
  
  finally
  
  {
  
  oSQLServer.DisConnect();
  
  }
  
  }
  
  /// <summary>
  
  /// 数据库恢复
  
  /// </summary>
  
  public string DbRestore(string url)
  
  {
  
  if(exepro()!=true)//执行存储过程
  
  {
  
  return "操作失败";
  
  }
  
  else
  
  {
  
  SQLDMO.Restore oRestore = new SQLDMO.RestoreClass();
  
  SQLDMO.SQLServer oSQLServer = new SQLDMO.SQLServerClass();
  
  try
  
  {
  
  oSQLServer.LoginSecure = false;
  
  oSQLServer.Connect(server, uid, pwd);
  
  oRestore.Action = SQLDMO.SQLDMO_RESTORE_TYPE.SQLDMORestore_Database;
  
  oRestore.Database = database;
  
  oRestore.Files = url;//@"d:\Northwind.bak";
  
  oRestore.FileNumber = 1;
  
  oRestore.ReplaceDatabase = true;
  
  oRestore.SQLRestore(oSQLServer);
  
  return "ok";
  
  }
  
  catch(Exception e)
  
  {
  
  return "恢复数据库失败";
  
  throw;
  
  }
  
  finally
  
  {
  
  oSQLServer.DisConnect();
  
  }
  
  }
  
  }
  
  private bool exepro()
  
  {
  
  SqlConnection conn1 = new SqlConnection("server="+server+";uid="+uid+";pwd="+pwd+";database=master");
  
  SqlCommand cmd = new SqlCommand("killspid",conn1);
  
  cmd.CommandType = CommandType.StoredProcedure;
  
  cmd.Parameters.Add("@dbname","port");
  
  try
  
  {
  
  conn1.Open();
  
  cmd.ExecuteNonQuery();
  
  return true;
  
  }
  
  catch(Exception ex)
  
  {
  
  return false;
  
  }
  
  finally
  
  {
  
  conn1.Close();
  
  }
  
  }
  
  }
  
}
今至电子科技有限公司
2024-08-23 广告
数据库备份是确保数据安全与业务连续性的关键环节。我们上海今至电子科技有限公司高度重视数据保护,定期执行全面的数据库备份策略。这包括使用先进工具和技术,对关键业务数据进行自动化备份,并存储在安全可靠的外部存储介质或云端。通过定期验证备份的完整... 点击进入详情页
本回答由今至电子科技有限公司提供
匿名用户
2013-07-07
展开全部
USE master
RESTORE DATABASE company FROM DISK= '备份数据库的地址' WITH STATS 在查询分析器中执行以上语句,地址是数据库备份文件存放的路径地址。Good Luck!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2013-07-07
展开全部
上你们发个成功的案例啊,尽在那里讲些有的没的,这些谁不会讲啊!!!!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式