using System
using System.Collections.Generic
using System.Text
using System.Data
using System.Data.SqlClient
using System.IO
using System.Collections
using System.Windows.Forms
namespace 我的备份与还原
{
class 备份与还原数据库
{
static string connectionString = "server=.database=masteruid=sapwd="
SqlConnection conn = new SqlConnection(connectionString)
/// <summary>
/// 备份指定的数据库文件
/// </summary>
/// <param name="databasename">要还原的数据库</param>
/// <returns></returns>
public bool BackUpDataBase( string databasefile)
{
if (!File.Exists(databasefile))
{
}
//还原的数据库MyDataBase
string sql = "BACKUP DATABASE " + "MyDataBase" + " TO DISK = '" + databasefile + ".bak' "
conn.Open()
SqlCommand comm = new SqlCommand(sql, conn)
comm.CommandType = CommandType.Text
try
{
comm.ExecuteNonQuery()
}
catch (Exception err)
{
string str = err.Message
conn.Close()
return false
}
conn.Close()//关闭数据库连接
return true
}
//以下是还原数据库,稍微麻烦些,要关闭所有与当前数据库相连的连接
//------------------------------------------------------------------------------------------
public string RestoreDatabase(string backfile)
{
///杀死原来所有的数据库连接进程
SqlConnection conn = new SqlConnection()
conn.ConnectionString = "Data Source=.Initial Catalog=masterUser ID=sapwd ="
conn.Open()
string sql = "SELECT spid FROM sysprocesses ,sysdatabases WHERE sysprocesses.dbid=sysdatabases.dbid AND sysdatabases.Name='" +
"MyDataBase"+ "'"
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)
{
MessageBox.Show(eee.ToString())
}
finally
{
conn.Close()
}
for (int i = 0i <list.Counti++)
{
conn.Open()
cmd1 = new SqlCommand(string.Format("KILL {0}", list[i].ToString()), conn)
cmd1.ExecuteNonQuery()
conn.Close()
MessageBox.Show("系统已经清除的数据库线程: " + list[i].ToString() + "\r\n正在还原数据库!")
}
//这里一定要是master数据库,而不能是要还原的数据库,因为这样便变成了有其它进程
//占用了数据库。
string constr = @"Data Source=.Initial Catalog=masterUser ID=sapwd ="
string database = MyDataBase
string path = backfile
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("还原成功,点击退出系统!")
Application.Exit()
}
catch (SqlException ee)
{
//throw(ee)
//MessageBox.Show("还原失败")
MessageBox.Show(ee.ToString())
}
finally
{
con.Close()
}
return "成功与否字符串"
}
}
}
停掉数据库服务器。将刚才生成的数据库的日志文件*_log.ldf删除,用要恢复的数据库mdf(*.mdf)文件覆盖刚才生成的数据库数据文件*.mdf。
启动数据库服务器。
restore
database
DemoDB
from
disk='c:\a.bak'
--c:\a.bak是备份文件名
with
move
'demodb_data01'
to
'...\demodb_data01.mdf'
--将要恢复到文件
,move
.....
,move
'demodb_log'
to
'...\demodb_log.ldf'
--------------------------------------------------------------------------------
有两种方法,不知道LZ喜欢哪种。1.使用SQL语句备份和还原数据库.
2.使用SQLDMO备份还原数据库.
我这里没有跟你的要求完全符合的。
只有一部分代码,你可以根据这些代码进行思考。
先放上SQL语句备份(我的数据库是SQL2000):
string str = "Server=(Local)DataBase=ScouringBathSysuser id=sapwd=saPersist Security Info=True"
this.saveFileDialog1.Title = "系统备份"
saveFileDialog1.Filter = "备份文件*.bak|*.bak"
saveFileDialog1.ShowDialog()
saveFileDialog1.DefaultExt = ".bak"
string strfilename = ""
strfilename = saveFileDialog1.FileName
try
{
con = new SqlConnection(str)
con.Open()
if (con.State == ConnectionState.Open)
{
SqlCommand cmd = new SqlCommand("BACKUP DATABASE ScouringBathSys TO DISK='" + strfilename + "'", con)
cmd.ExecuteNonQuery()
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message)
}
finally
{
if (con.State == ConnectionState.Open)
{
con.Close()
}
}
这是别人的代码让我测试,我改了改。我这里没有还原的。
SQLDMO形式备份数据库:
//记录文件名
string resultFile = ""
//初始化在C盘
sfdFile.InitialDirectory = "C:\\"
//过滤所有文件
sfdFile.Filter = "All files (*.*)|*.*|txt files (*.txt)|*.txt"
sfdFile.FilterIndex = 2
sfdFile.RestoreDirectory = true
if (sfdFile.ShowDialog() == DialogResult.OK)
{
resultFile = sfdFile.FileName
try
{
for (int i = 0i <this.dgvDBBackup.Rows.Count-1i++)
{
if (this.dgvDBBackup.Rows[i].Selected)
{
if (DbBackup(sname, uname, pwd, dbname, resultFile) == true)
{
MessageBox.Show("备份成功")
}
else
{
MessageBox.Show("备份失败")
}
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message)
}
}
DbBackup就是备份数据库代码,如下:
//声明变量isOk用来返回执行结果
bool isOk=false
SQLDMO.Backup oBackup = new SQLDMO.BackupClass()
SQLDMO.SQLServer oSQLServer = new SQLDMO.SQLServerClass()
try
{
oSQLServer.LoginSecure = false
oSQLServer.Connect(sqlServer, userid, password)
oBackup.Action = SQLDMO.SQLDMO_BACKUP_TYPE.SQLDMOBackup_Database//全部或增量备份
oBackup.Database = database//要备份的数据库
oBackup.Files = filePath//标明备份文件的路径和名字
oBackup.BackupSetName = database//备份文件的名字
oBackup.Devices = null
oBackup.BackupSetDescription = "数据库备份"//备份说明
oBackup.Initialize = true
oBackup.SQLBackup(oSQLServer)
isOk = true//执行成功
}
catch
{
isOk = false//执行失败
throw
}
finally
{
oSQLServer.DisConnect()
}
//返回结果
return isOk
代码你看着肯定会觉得乱,理所当然。SQLDMO要记得引用。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)