通过c# winform程序如何对数据库进行备份和还原?

通过c# winform程序如何对数据库进行备份和还原?,第1张

WinForm c# 备份 还原 数据库, 其实是个非常简单的问题,一个Form,一个Button,一个OpenFileDialog,一个SaveFileDialog.下面给出备份与还原类

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要记得引用。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/10076092.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存