您的位置:逆风者 VC++ 正文
 添加时间:2007-09-01 原文发表:2007-08-31 人气:31 来源:vckbase.com

本文章共5811字,分3页,当前第1页,快速翻页:
 

介绍一种数据库远程备份方案

作者:徐景周

下载源代码

功能简述

逆@风@者
  服务端(发送方)和客户端(接收方)定好数据库结构及内容格式后,由服务端将数据库生成指定XML格式文件后, 通过Socket发给客户端。客户端接收成功后,用收到的XML库格式文件,生成数据库。

用例图:

设计

   根据以上需求,采用VC6.0生成两个工程文件:DBClent(客户端及接收方)和DBServer(服务端及发送方)。其中DBClient负责接收XML库格式文件并生成数据库,DBServer负责生成指定格式的XML库文件与发送此文件给DBClient。

总体类图:

实现

1、数据库转换为XML格式设计 规定:数据库用Database,在其节点属性中用name来指定数据库名称。其子节点可能有多个表,表节点名为:Table,其节点属性中name用来指定表名称。表节点下包括表结构描述Struct和内容描述Content。表结构中列名用节点Field表示,名称/类型/长度等在其属性中表示。表内容中用节点Record表示每个记录,详细信息在属性中表示。

示例: DBTest.xml


<?xml version="1.0" encoding="GB2312"?>

<Database xmlns:xlink="http://www.w3.org/1999/xlink" version="1.0" name="dbTest.mdb">

	<Table name="dbTest">

		<Struct>

			<Field fieldName="Name" fieldType="VARCHAR" fieldLength="20"/>

			<Field fieldName="Age" fieldType="VARCHAR" fieldLength="3"/>

		</Struct>

		<Content>

			<Record name="徐景周" age="29" />

			<Record name="赵振华" age="25" />

			<Record name="田子叶" age="29" />

			<Record name="张军旗" age="29" />

			<Record name="黄辉" age="29" />

			<Record name="赵顔锋" age="29" />

			<Record name="魏小明" age="29" />

			<Record name="赵锐" age="29" />

		</Content>

	</Table>

</Database>

2、服务端(发送方)实现 采用Socket套接字在指定端口发送生成的XML库格式文件。生成程序界面效果如下:

示例代码如下:


// 发送指定的XML文件

#define PRE_AGREED_PORT	8686		// 端口号

#define SEND_BUFFER_SIZE	4096		// 缓冲区大小



BOOL CDBServerDlg::SendFileToRemoteRecipient(CString fName)

{



	AfxSocketInit( NULL );				

	CSocket sockSrvr; 

	sockSrvr.Create( PRE_AGREED_PORT );	// 指定端口创建socket

	sockSrvr.Listen();				// 侦听端口上的客户端

	CSocket sockConnection;

	sockSrvr.Accept( sockConnection );		// 用另一个socket接收连接

	

	// 是否成功

	BOOL bRet = TRUE;				



	int fileLength, cbLeftToSend;			// 文件长度及发送进度

	

	BYTE* sendData = NULL;			// 发送数据缓冲指针

	

	CFile sourceFile;

	CFileException fe;

	BOOL bFileIsOpen = FALSE;

	

	if( !( bFileIsOpen = sourceFile.Open( fName, CFile::modeRead | CFile::typeBinary, &fe ) ) )

	{

		TCHAR strCause[256];

		fe.GetErrorMessage( strCause, 255 );

		TRACE( "SendFileToRemoteRecipient encountered an error while opening the local file\n"

			"\tFile name = %s\n\tCause = %s\n\tm_cause = %d\n\tm_IOsError = %d\n",

			fe.m_strFileName, strCause, fe.m_cause, fe.m_lOsError );

		

		bRet = FALSE;

		goto PreReturnCleanup;

	}

	



	// 首先,发送文件长度

	fileLength = sourceFile.GetLength();

	fileLength = htonl( fileLength );

	

	cbLeftToSend = sizeof( fileLength );

	

	do

	{

		int cbBytesSent;

		BYTE* bp = (BYTE*)(&fileLength)   sizeof(fileLength) - cbLeftToSend;

		cbBytesSent = sockConnection.Send( bp, cbLeftToSend );

		

		// 是否出错

		if( cbBytesSent == SOCKET_ERROR )

		{

			int iErr = ::GetLastError();

			TRACE( "SendFileToRemoteRecipient returned a socket error while sending file length\n"

				"\tNumber of Bytes sent = %d\n"

				"\tGetLastError = %d\n", cbBytesSent, iErr );



			bRet = FALSE;

			goto PreReturnCleanup;

		}

		

		// 发送成功后, 剩余发送总数= 总长度-已发送长度

		cbLeftToSend -= cbBytesSent;

	}

	while( cbLeftToSend > 0 );

	

	

	// 然后,发送文件数据

	sendData = new BYTE[SEND_BUFFER_SIZE]; 

	

	cbLeftToSend = sourceFile.GetLength();

	

	do

	{

		// 从文件中读取指定缓冲字节

		int sendThisTime, doneSoFar, buffOffset;

		

		sendThisTime = sourceFile.Read( sendData, SEND_BUFFER_SIZE );

		buffOffset = 0;

		

		do

		{

			doneSoFar = sockConnection.Send( sendData   buffOffset, sendThisTime ); 

			

			// 是否出错

			if( doneSoFar == SOCKET_ERROR )

			{

				int iErr = ::GetLastError();

				TRACE( "SendFileToRemoteRecipient returned a socket error while sending chunked file data\n"

					"\tNumber of Bytes sent = %d\n"

					"\tGetLastError = %d\n", doneSoFar, iErr );

				

				bRet = FALSE;

				goto PreReturnCleanup;

			}

			

			// 发送成功后, 剩余发送字节及偏移

			buffOffset  = doneSoFar;

			sendThisTime -= doneSoFar;

			cbLeftToSend -= doneSoFar;

		}

		while ( sendThisTime > 0 );

		

	}

	while( cbLeftToSend > 0 );

	

	

PreReturnCleanup:		// 结束及清理

	

	// 释放内存及关闭打开句柄

	delete[] sendData;

	

	if( bFileIsOpen )

		sourceFile.Close();	

	

	sockConnection.Close();

	

	return bRet;

	

}

 
 
本文章更多内容1 - 2 - 3 - 下一页>>
相关文章

Windows CE下驱动开发基础
编写、加载和存取插件程序(Plug-Ins)
通过串口收发短消息(下)
一个打印报表的简单的类
QQ界面的模拟实现(下)
USB有关的编程
杂谈:人与软件
通用权限管理模块的设计与实现
基于TCP的局域网多用户通信、文件传送程序详
通用图像类算法扩充库
QQ魔法表情实现原理
支持数据项查找功能的树控制(CTreeCtrl)类
把 C# 语言开发的控件内嵌在网页里面
使用免费界面换肤软件 USkin
一个关于#include的问题
如何用代码动态添加控件
C 程序的外部变量与函数
通过串口收发短消息(上)
更改屏幕显示数据的作弊程序
在VC中使用 Flash 美化你的程序

相关评论


本文章所属分类:首页 VC++

  热门关键字: