3.9.7 数据库还原界面的实现(1)
还原模块实现起来要比备份复杂些。主要是因为还原的时候要断开连接,否则是不允许还原的。还原界面中路径选择设计与备份一样,在此不再重复说明。首先介绍如何在列表控件中显示所有的备份文件。相关代码如下:
代码位置:见光盘中本章源代码的CRESTOREDLG类。
- 1 void CRESTOREDLG::SetListStyle()
- 2 { //列表控件初始化
- 3 m_list.InsertColumn(0,"序号",LVCFMT_LEFT,100);
- 4 m_list.InsertColumn(1,"时间",LVCFMT_LEFT,140);
- 5 m_list.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);
- 6 m_record=NULL;
- 7 m_record.CreateInstance(__uuidof(Recordset)); //记录集初始化
- 8 CString sqlstr;
- 9 sqlstr.Format("select * from tb_backup"); //查找备份号
- 10 m_record->Open((_variant_t )sqlstr,theApp.m_connection.GetInterfacePtr(),
- 11 adOpenDynamic,adLockOptimistic,adCmdText); //执行查找备份号操作
- 12 try
- 13 {
- 14 int i=0;
- 15 while(!m_record->_EOF) //记录没有移动到最后
- 16 {
- 17 CString str=(LPCSTR)(_bstr_t)m_record->Fields->GetItem("id")->Value; //获取备份号
- 18 m_list.InsertItem(i,str); //插入到列表控件中
- 19 COleDateTime tm;
- 20 tm=(COleDateTime)m_record->Fields->GetItem("backuptime")->Value; //获取备份时间
- 21 m_list.SetItemText(i,1,tm.Format("%Y-%m-%d-%H:%M:%S")); //插入到列表控件中
- 22 i++;
- 23 m_record->MoveNext(); //记录后移
- 24 }
- 25 }
- 26 catch(...)
- 27 {
- 28 MessageBox("没有还原记录!");
- 29 CDialog::OnCancel();
- 30 }
- 31 }
第8~11行代码打开数据表tb_backup,该表保存所有备份文件的序号、名称、路径。
第19~21行代码实现了时间的输出,这里面涉及COleDateTime类型的数据类型到字符串CString的转换。
tb_backup数据表中存储以前备份的文件信息,通过遍历数据表读取各条记录写入到列表控件中完成初始化操作。
当用户选中某条记录后,单击【数据还原】按钮,实现数据库的还原操作。下面介绍还原的实现过程,相关代码参考如下:
代码位置:见光盘中本章源代码的CRESTOREDLG类。
- 1 void CRESTOREDLG::OnButton3()
- 2 {
- 3 AfxBeginThread(restore,this); //启动线程
- 4 UpdateData();
- 5 try
- 6 {
- 7 theApp.m_connection->Close();
- 8 CString sqlstr;
- 9 //获得数据库连接进程
- 10 sqlstr="select spid from master..sysprocesses where dbid=db_id('Sales')";
- 11 _RecordsetPtr recordset; //定义记录集对象
- 12 recordset.CreateInstance(__uuidof(Recordset)); //记录集对象初始化
- 13 recordset=theApp.m_connection1->Execute((_bstr_t)sqlstr,NULL,
- adModeUnknown);
- 14 while(!recordset->_EOF) //记录没有到最后
- 15 {
- 16 CString temp=(LPCSTR)(_bstr_t)recordset->Fields->GetItem("spid")->
- Value;
- 17 sqlstr.Format("kill %i",atoi(temp));
- 18 //断开连接数据库进程
- 19 theApp.m_connection1->Execute((_bstr_t)sqlstr,NULL,adModeUnknown);
- 20 recordset->MoveNext(); //记录后移
- 21 }
- 22 sqlstr.Format(" restore database Sales from disk='%s'",m_edit); //构造数据还原语句
- 23 theApp.m_connection1->Execute((_bstr_t)sqlstr,NULL,adModeUnknown); //执行数据还原操作
- 24 Sleep(70000); //延迟连接数据库
- 25 MessageBox("还原成功!");
- 26 CDialog::OnCancel();
- 27 theApp.ConnectSql("driver={SQL Server};Server=HC\\MSSQL2008;
- 28 Database=Sales");//重新连接
- 29 }
- 30 catch(...)
- 31 {
- 32 MessageBox("还原失败");
- 33 CDialog::OnCancel();
- 34 }
- 35 }