由于软件的需要,组长让我做个数据库备份和还原,刚开始我是备份到软件根目录E:\oms\Web\App_Data下的,后来组长说要根据年月来建文件夹,把备份的数据库文件放到建的文件夹里。就这么小的一点建议,搞得我弄了半天。
现在我把相关代码写在这儿,以备以后再用
数据库备份的存储过程:
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
CREATE PROCEDURE [dbo].[databaseBack]
@backId UNIQUEIDENTIFIER,
@strPath NVARCHAR(200)
AS
BEGIN
DECLARE @strPaths NVARCHAR(200)
set @strPaths = convert(NVARCHAR(19),getdate(),120)
set @strPaths = REPLACE(@strPaths, ':' , '.')
set @strPaths = REPLACE(@strPaths, ' ' , '.')
set @strPaths = @strPath+'/'+@strPaths + '.bak'
BACKUP DATABASE [oms] TO DISK = @strPaths WITH NOINIT , NOUNLOAD , NOSKIP , STATS = 10, NOFORMAT
EN
表示层后台代码:
//获取软件的根目录
string actualServerPath = Server.MapPath(Request.Path);
int pathindex = actualServerPath.LastIndexOf("\\");
string path = actualServerPath.Substring(0, pathindex);
path += "\\";
//在软件的根目录下建文件夹
DateTime time = DateTime.Now;
string paths = "DataBase/" + time.Year.ToString();
if (!Directory.Exists(Server.MapPath(paths)))
{
Directory.CreateDirectory(Server.MapPath(paths));
}
paths += "/" + time.Month.ToString();
if (!Directory.Exists(Server.MapPath(paths)))
{
Directory.CreateDirectory(Server.MapPath(paths));
}
//由于程序中的根目录和建的文件夹路径中的斜杠不一样,所以需要转换(这点特别要注意了)
path += paths.Replace('/','\\');
然后直接调用存储过程就ok了。
备份要注意的问题:
1、要备份的数据库必须和软件在同一台机器上
2、备份的文件必须加后缀名:.bak
3、软件的根目录和建的文件夹路径中的斜杠要转换一致
数据库恢复的表示层后台代码:
//backConnection是web.config中的连接字符串名
Database db = DatabaseFactory.CreateDatabase("backConnection");
string sql = "select spid from master..sysprocesses where dbid=db_id(@dbname)";
DbCommand cmd = db.GetSqlStringCommand(sql);
db.AddInParameter(cmd, "@dbname", DbType.String, "oms");
IDataReader dr = db.ExecuteReader(cmd);
List<string> process = new List<string>();
try
{
while (dr.Read())
{
process.Add(dr[0].ToString().Trim());
}
}
catch
{ }
dr.Close();
cmd.Parameters.Clear();
//杀死进程
foreach (string s in process)
{
db.ExecuteNonQuery(CommandType.Text, "exec('kill " + s + "') ");
}
//恢复sql语句
sql = "restore database oms from disk=@path WITH REPLACE";
cmd = db.GetSqlStringCommand(sql);
//path是要恢复的文件路径
db.AddInParameter(cmd, "@path", DbType.String, path);
db.ExecuteNonQuery(cmd);
cmd.Connection.Close();
cmd.Parameters.Clear();
cmd.Dispose();
Response.Write("<script>alert('恢复成功!')</script>");
恢复数据库要注意的问题:
1、要恢复的数据库跟正在运行的软件所连接的数据库不能是同一个
2、恢复数据库用master系统数据库强制杀死软件正在运行的数据库进程