📄 database.cpp
字号:
// 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 + -