⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 database.cpp

📁 数据库的定义 大家看看把 提点意见
💻 CPP
📖 第 1 页 / 共 3 页
字号:
// DataBase.cpp: implementation of the CDataBase class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
//#include "SwitDbase.h"
#include "DataBase.h"
//#include <objbase.h>


#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

 

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CDataBase::CDataBase()
{		
	CoInitialize(NULL);

	m_pConnection=NULL;
//	AfxOleInit();
	g_DataBaseID="driver={SQL Server};Server=127.0.0.1;DATABASE=Swit1;UID=sa;PWD=123";

}

CDataBase::~CDataBase()
{
	CoUninitialize();
}

/************************************************************************/
/*  功能:增加一项文件信息记录到文件表,文件信息有fid, fname,fsize,ftype,keyid,keyword,remark,pid
  
	传入参数:类型为FileInfo结构体,
	struct FileInfo					//文件信息,上传共享资源时文件的详细信息
	{
	byte fileID[20];                //文件ID
	char fileName[50];				//文件名
	unsigned short fileType;		//文件类型
	DWORD fileSize;					//文件大小
	char keyWord[20];				//关键词
	byte keyID[20];					//关键词ID
	char remark[100];               //备注
	byte peerID[20];				//节点ID 
	};
	
	 返回值:
	 TRUE:  正常返回 
	 FALSE:异常返回
*/
/************************************************************************/
//增加一项记录到文件表,成功TRUE,失败false
BOOL CDataBase::AddFileRecord(EDSFileInfo file,char *pID)
{
	CString sqlFile;
	CString sqlPeer;
	
//	InitDataBase();
	try
	{ //完成文件信息(fid, fname,fsize,ftype,keyid,keyword,remark)到数据库filelist表信息的插入	
		sqlFile.Format("insert into filelist (fid, fname,fsize,ftype,keyid,keyword,remark) values ('%s','%s',%d,%d,'%s','%s','%s')",
			file.fileID,file.fileName,file.fileSize,file.fileType,file.keyID,file.keyWord,file.remark);
		BSTR bSql = sqlFile.AllocSysString();
		if(!Excute(bSql))
			return FALSE;
		
		//fid,pid插入filepeer表
		sqlPeer.Format("insert into filepeer (fid,pid) values ('%s','%s')",file.fileID,pID);
		bSql = sqlPeer.AllocSysString();
		if(!Excute(bSql))
			return FALSE;
	}
	catch(_com_error e)   
	{   
		AfxMessageBox(e.Description());   
	}   
//	m_pConnection->Close();
	
	return TRUE;
}





/************************************************************************/
/*  功能:添加一个peer信息到数据库peer表,peer信息有 pid,ip,port
  
	传入参数:类型为PeerInfo结构体,
	struct PeerInfo{			//节点信息,向数据库中插入时用
	byte pID[20];				//节点ID
	char IP[20];				//节点IP
	unsigned short Port; 		//节点端口
	};
	
	返回值:
	TRUE:  正常返回 
	FALSE:异常返回
*/
/************************************************************************/
//添加一个peer信息到数据库peer表,成功TRUE,失败FALSE
BOOL CDataBase::AddPeerInfo(char *pID,char *IP)
{
	CString sql;

	InitDataBase();
	try
	{ //完成登陆信息(PeerID,IP,PORT)数据库表信息的插入peer表
		
		sql.Format("insert into peer (pid,ip,port,status) values('%s','%s',%d,%d)",pID,IP,7812,0); 
		BSTR bSql = sql.AllocSysString();
		if(!Excute(bSql))
			return FALSE;
	}
	catch(_com_error e)   
	{   
		AfxMessageBox(e.Description());   
	}   
//	m_pConnection->Close();
	return TRUE;
}





/************************************************************************/
/*  功能:根据文件的关键字获得一个文件的列表,列表返回在参数中
  
	传入参数:类型为byte的关键字keyID,得到结果在filelist
	
	
	返回值:
	TRUE:  正常返回 
	FALSE:异常返回
*/
/************************************************************************/
//根据文件的关键字获得一个文件的列表,列表返回在参数中
BOOL CDataBase::SearchKeyword(char *keyID,CFileList& fileList)
{
	CString sql;
	
	InitDataBase();
	try
	{ 
		
		sql.Format("select fid,fname,fsize,ftype,remark from filelist where keyid='%s'",keyID);
		BSTR bSql = sql.AllocSysString();

		_variant_t vFid,vFname,vFsize,vFtype,vRemark;
		
		m_pRecordset.CreateInstance("ADODB.Recordset");
		m_pRecordset->Open(bSql,_variant_t((IDispatch*)m_pConnection,true),adOpenStatic,adLockOptimistic,adCmdText);
		while(!m_pRecordset->adoEOF)
		{
			// vID = m_pRecordset->GetCollect(_variant_t((long)0));//取得第1列的值,从0开始计数,也可以直接给出列的名称,如下一行
			vFname = m_pRecordset->GetCollect("fname");//取得fname字段的值
			vFsize = m_pRecordset->GetCollect("fsize");
			vFtype = m_pRecordset->GetCollect("ftype");
			vRemark = m_pRecordset->GetCollect("remark");
			vFid	= m_pRecordset->GetCollect("fid");

			FileItem fItem;
			IDStrToByte(fItem.fileID,(LPCTSTR)(_bstr_t)vFid);
			strcpy(fItem.fileName,(LPCTSTR)(_bstr_t)vFname);
			fItem.fileType=(unsigned short)vFtype.lVal;
			fItem.fileSize=vFsize.lVal;
			strcpy(fItem.remark,(LPCTSTR)(_bstr_t)vRemark);

			fileList.AddTail(fItem);
			TRACE("fname:%s,fsize:%d,ftype:%d,remark:%s\r\n",(LPCTSTR)(_bstr_t)vFname,vFsize.lVal,vFtype.lVal,(LPCTSTR)(_bstr_t)vRemark);
			m_pRecordset->MoveNext();///移到下一条记录
		}
//		m_pRecordset->MoveFirst();///移到首条记录
//		m_pRecordset->Delete(adAffectCurrent);///删除当前记录
		

		//		BSTR bSql = sql.AllocSysString();
		//					if(!Excute(bSql))
		//						return FALSE;	
		
	
	}
	catch(_com_error e)   
	{   
		TRACE("keyID查询失败!");
		AfxMessageBox(e.Description());   
	}   
	m_pConnection->Close();
	
	return TRUE;
}





/************************************************************************/
/*  功能:查找拥有文件节点的IP,Port,结果返回在PeerList链表中
  
	传入参数:类型为byte 的fileID,返回结果在Peerlist

	
	返回值:
	TRUE:  正常返回 
	FALSE:异常返回
*/
/************************************************************************/
//查找拥有文件节点的IP,Port,结果返回在PeerList链表中
BOOL CDataBase::SearchFilePeer(char *fileID,CPeerList& PeerList)
{
	CString sql;

	InitDataBase();
	try
	{ 
		sql.Format("select ip,port from peer where status='1' and  pid in (select pid from filepeer where fid='%s')",fileID);
	//	"select ip,port from peer where pid in (select peerid from File_peer_TABLE where FileID='%s' and filename='%s')",fileid,filename
		BSTR bSql = sql.AllocSysString();
		
		_variant_t vIP,vPort;
		
		m_pRecordset.CreateInstance("ADODB.Recordset");
		HRESULT hr=m_pRecordset->Open(bSql,_variant_t((IDispatch*)m_pConnection,true),adOpenStatic,adLockOptimistic,adCmdText);
		if(FAILED(hr))
			return FALSE;
		while(!m_pRecordset->adoEOF)
		{
			// vID = m_pRecordset->GetCollect(_variant_t((long)0));//取得第1列的值,从0开始计数,也可以直接给出列的名称,如下一行
			vIP = m_pRecordset->GetCollect("ip");//取得ip字段的值
			vPort = m_pRecordset->GetCollect("port");
		
//			char str[20];
//			strcpy(str,(LPCTSTR)(_bstr_t)vIP);
//			unsigned short ss=vPort.lVal;

			PeerItem pItem;
//			TRACE("vip:%s,vport:%d\r\n",str,ss);
			strcpy(pItem.IP,(LPCTSTR)(_bstr_t)vIP);
			pItem.Port=(unsigned short)vPort.lVal;

			PeerList.AddTail(pItem);
				/*
			
				FileItem fItem;
				strcpy(fItem.fileName,(LPCTSTR)(_bstr_t)vFname);
				fItem.fileType=vFtype.lVal;
				fItem.fileSize=vFsize.lVal;
				strcpy(fItem.remark,(LPCTSTR)(_bstr_t)vRemark);
				*/
	
//			fileList.AddTail(fItem);
//			TRACE("fname:%s,fsize:%d,ftype:%d,remark:%s\r\n",(LPCTSTR)(_bstr_t)vFname,vFsize.lVal,vFtype.lVal,(LPCTSTR)(_bstr_t)vRemark);
			m_pRecordset->MoveNext();///移到下一条记录
		}
//		m_pRecordset->MoveFirst();///移到首条记录
//		m_pRecordset->Delete(adAffectCurrent);///删除当前记录
	}
	catch(_com_error e)   
	{   
		TRACE("查询客户ip,port失败!");
		AfxMessageBox(e.Description());   
	}   
	m_pConnection->Close();
	
	return TRUE;
}

//数据库初始化连接,创建连接成功TRUE,失败FALSE
BOOL CDataBase::InitDataBase()
{
	if (!OpenDataBase()) {
//		AfxMessageBox("与数据库连接失败");
		return FALSE;//与数据库连接失败
	}

	return TRUE;
}

//创建数据库连接对象m_pConnection,成功TRUE,失败FALSE
BOOL CDataBase::OpenDataBase()
{
	try
	{
		HRESULT hr=m_pConnection.CreateInstance("ADODB.Connection");//创建数据库连接对象
		if(FAILED(hr))
		{
			AfxMessageBox("创建连接数据库对象失败!");
			return FALSE;	
		}
		else
		{
            //AfxMessageBox("创建连接数据库对象成功");   
			TRACE("创建连接数据库对象成功");
			//return TRUE;
		}

		hr=m_pConnection->Open((_bstr_t)g_DataBaseID,"","",adOpenUnspecified); //连接数据库
		if(FAILED(hr))
		{	
			AfxMessageBox("连接数据库失败"); 
			return FALSE;	
		}
		else
		{
            //AfxMessageBox("连接数据库成功");   
			TRACE("连接数据库成功");
			//return TRUE;
		}
	}
	catch(_com_error   e)   
	{   
		AfxMessageBox(e.Description());   
	}   
    return TRUE;

}



BOOL CDataBase::Excute(CString sql)// 执行SQL语句
{
	_variant_t  RecordsAffected;
	try
	{
		m_pConnection->Execute((_bstr_t)sql,&RecordsAffected, 1);
	}

	catch(_com_error   e)
	{
		AfxMessageBox("执行SQL语句失败!");
		AfxMessageBox(e.Description());
	}
	
	//if(FAILED(hr))
	//		{
	//			AfxMessageBox("执行SQL语句失败!");
	//			return FALSE;
	//		}
	
	
	
	return TRUE;
}





/************************************************************************/
/*  功能:更新文件信息
  
	传入参数:类型为FileInfo的结构体
	struct FileInfo					//文件信息,上传共享资源时文件的详细信息
	{
	byte fileID[20];                //文件ID
	char fileName[50];				//文件名
	unsigned short fileType;		//文件类型
	DWORD fileSize;					//文件大小
	char keyWord[20];				//关键词
	byte keyID[20];					//关键词ID
	char remark[100];               //备注
	byte peerID[20];
	};
	
	返回值:
	TRUE:  正常返回 
	FALSE:异常返回
*/
/************************************************************************/
//更新文件信息,成功TRUE,失败FALSE
BOOL CDataBase::UpdateFile(FileInfo file)
{
	CString sql;
	
	InitDataBase();
	try
	{ 
		sql.Format("update filelist set fid='%s',fname='%s',fsize=%d,ftype=%d,keyid='%s',keyword='%s' where fid='%s'",
					IDByteToStr(file.fileID),file.fileName,file.fileSize,file.fileType,IDByteToStr(file.keyID),file.keyWord,IDByteToStr(file.fileID));
		BSTR bSql = sql.AllocSysString();
		if(!Excute(bSql))
			return FALSE;
	}
	catch(_com_error e)   
	{   
		AfxMessageBox(e.Description());   
	}   
	m_pConnection->Close();
	return TRUE;
}

/************************************************************************/
/*  功能:更新peer节点信息
  
	传入参数:类型为PeerInfo的结构体
	struct PeerInfo{			//节点信息,向数据库中插入时用
	byte pID[20];				//节点ID
	char IP[20];				//节点IP
	unsigned short Port; 		//节点端口
	};
	
	返回值:
	TRUE:  正常返回 
	FALSE:异常返回
*/
/************************************************************************/
//更新节点信息,成功TRUE,失败FALSE
BOOL CDataBase::UpdatePeer(PeerInfo peer)
{
	CString sql;
	
	InitDataBase();
	try
	{ 
		sql.Format("update peer set ip='%s',port=%d where pid='%s'",peer.IP,peer.Port,IDByteToStr(peer.pID)); 
		BSTR bSql = sql.AllocSysString();
		if(!Excute(bSql))
			return FALSE;
	}
	catch(_com_error e)   
	{   
		AfxMessageBox(e.Description());   
	}   
	m_pConnection->Close();
	return TRUE;
}




/************************************************************************/
/*  功能:根据文件ID删除filelist信息
  
	传入参数:类型为byte 的fileID
	
	返回值:
	TRUE:  正常返回 
	FALSE:异常返回
*/
/************************************************************************/
//根据文件ID删除filelist信息,成功TRUE,失败FALSE
BOOL CDataBase::DeleteFile(char *fileID)
{
	CString sql;
	
//	InitDataBase();
	try
	{ 
		sql.Format("delete from filelist where fid='%s'",fileID); 
		BSTR bSql = sql.AllocSysString();
		if(!Excute(bSql))
			return FALSE;
	}
	catch(_com_error e)   
	{   
		AfxMessageBox(e.Description());   
	}   
//	m_pConnection->Close();
	return TRUE;
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -