www.pudn.com > duanxinfangwei.rar > DbInterface.cpp


// DbInterface.cpp: implementation of the CDbInterface class. 
// 
////////////////////////////////////////////////////////////////////// 
 
#include "stdafx.h" 
#include "smspreventforgery.h" 
#include "DbInterface.h" 
 
#ifdef _DEBUG 
#undef THIS_FILE 
static char THIS_FILE[]=__FILE__; 
#define new DEBUG_NEW 
#endif 
 
////////////////////////////////////////////////////////////////////// 
// Construction/Destruction 
////////////////////////////////////////////////////////////////////// 
 
CDbInterface::CDbInterface() 
{ 
	::CoInitialize(NULL); 
 
	/* ACCESS数据库 */ 
	char szFileName[256]; 
	GetModuleFileName(NULL,szFileName,256); 
	char szDrive[256]={0}; 
	char szDir[256]={0}; 
	char szPath[256]={0}; 
	_tsplitpath(szFileName,szDrive,szDir,NULL,NULL); 
	sprintf(szPath,"%s%s",szDrive,szDir); 
 
	DATASOURCE.Format(DATASOURCE_ACCESS, szPath); 
} 
 
CDbInterface::~CDbInterface() 
{ 
 
} 
 
/********************************************************************** 
 * 函数名:	AppendNewProduct 
 * 功  能:  追加新的产品 
 * 参  数:  CString							产品名 
 * 返回值:  bool							true	成功 
 *											false	失败 
 *********************************************************************/ 
bool CDbInterface::AppendNewProduct(CString productName) 
{ 
	_ConnectionPtr	pConnection; 
	_variant_t		RecordsAffected;		//影响行数 
	CString			SQL; 
	bool			bRet; 
 
	pConnection.CreateInstance(__uuidof(Connection)); 
 
	/* 取得当前时间 */ 
	CTime currentTime = CTime::GetCurrentTime(); 
	CString strCurrentTime = currentTime.Format("%Y-%m-%d %H:%M:%S"); 
 
	try 
	{ 
		pConnection->Open((_bstr_t)DATASOURCE, DATAUSER, DATAPWD, adModeUnknown); 
		SQL.Format("INSERT INTO smspre_product(productName, entertime) VALUES(\'%s\', \'%s\')", 
				productName, strCurrentTime); 
		pConnection->Execute((_bstr_t)SQL, &RecordsAffected, adCmdText); 
 
		bRet = true; 
	} 
	catch(_com_error e) 
	{ 
		bRet = false; 
	} 
	catch(...) 
	{ 
		bRet = false; 
	} 
 
	if(pConnection->State) 
		pConnection->Close(); 
	pConnection = NULL; 
 
	return bRet; 
} 
 
/********************************************************************** 
 * 函数名:	CheckProduct 
 * 功  能:  检查产品是否已存在 
 * 参  数:  CString							产品名 
 *		 :	bool &							存在标志 
 * 返回值:  bool							true	成功 
 *											false	失败 
 *********************************************************************/ 
bool CDbInterface::CheckProduct(CString productName, bool &existFlag) 
{ 
	_ConnectionPtr	pConnection; 
	_RecordsetPtr	pRecordset; 
	_variant_t RecordsAffected;		//影响行数 
	_variant_t		var; 
	CString			SQL; 
	bool			bRet; 
 
	pConnection.CreateInstance(__uuidof(Connection)); 
	pRecordset.CreateInstance(__uuidof(Recordset)); 
 
	bRet = true; 
	try 
	{ 
		SQL.Format("SELECT * FROM smspre_product WHERE productName = \'%s\'", productName);	 
		pConnection->Open((_bstr_t)DATASOURCE, DATAUSER, DATAPWD, adModeUnknown); 
		pRecordset->Open((_variant_t)SQL,        
						pConnection.GetInterfacePtr(),	  
						adOpenDynamic, 
						adLockOptimistic, 
						adCmdText); 
		if(pRecordset->adoEOF && pRecordset->BOF) 
		{ 
			existFlag = false; 
		} 
		else 
		{ 
			existFlag = true; 
		} 
		pRecordset->Close();		 
	} 
	catch(_com_error e) 
	{ 
		/* 加入写LOG文件相关代码 */ 
		bRet = false; 
	} 
	catch(...) 
	{ 
		bRet = false; 
	} 
 
	if(pConnection->State) 
		pConnection->Close(); 
	pConnection = NULL; 
 
	return bRet; 
} 
 
/********************************************************************** 
 * 函数名:	GetProductList 
 * 功  能:  取得产品列表 
 * 参  数:  std::list &		产品列表 
 * 返回值:  bool							true	成功 
 *											false	失败 
 *********************************************************************/ 
bool CDbInterface::GetProductList(std::list &productList) 
{ 
	_ConnectionPtr	pConnection; 
	_RecordsetPtr	pRecordset; 
	_variant_t		RecordsAffected;		//影响行数 
	_variant_t		var; 
	CString			SQL; 
	bool			bRet; 
 
	pConnection.CreateInstance(__uuidof(Connection)); 
	pRecordset.CreateInstance(__uuidof(Recordset)); 
 
	bRet = true; 
	try 
	{ 
		SQL.Format("SELECT * FROM smspre_product ORDER BY productId DESC");	 
		pConnection->Open((_bstr_t)DATASOURCE, DATAUSER, DATAPWD, adModeUnknown); 
		pRecordset->Open((_variant_t)SQL,        
						pConnection.GetInterfacePtr(),	  
						adOpenDynamic, 
						adLockOptimistic, 
						adCmdText); 
		productList.clear(); 
		while(!pRecordset->adoEOF) 
		{ 
			PRODUCTINFO productInfo; 
			//取得产品ID 
			pRecordset->get_Collect(_variant_t("productId"), (_variant_t*)(&var));			 
			if(var.vt != VT_NULL) 
			{ 
				productInfo.productId = var.iVal; 
			} 
			//取得产品名称 
			pRecordset->get_Collect(_variant_t("productName"), (_variant_t*)(&var));			 
			if(var.vt != VT_NULL) 
			{ 
				productInfo.productName = (LPCSTR)_bstr_t(var); 
			} 
			//取得进入日期 
			pRecordset->get_Collect(_variant_t("entertime"), (_variant_t*)(&var));			 
			if(var.vt != VT_NULL) 
			{ 
				productInfo.entertime = (LPCSTR)_bstr_t(var); 
			} 
 
			productList.push_back(productInfo); 
 
			//称动指针 
			pRecordset->MoveNext(); 
		} 
		pRecordset->Close();		 
	} 
	catch(_com_error e) 
	{ 
		/* 加入写LOG文件相关代码 */ 
		bRet = false; 
	} 
	catch(...) 
	{ 
		bRet = false; 
	} 
 
	if(pConnection->State) 
		pConnection->Close(); 
	pConnection = NULL; 
 
	return bRet; 
} 
 
/********************************************************************** 
 * 函数名:	GetProductInfo 
 * 功  能:  取得产品信息 
 * 参  数:  CString							产品名 
 *		 :  PRODUCTINFO &					产品信息 	 
 * 返回值:  bool							true	成功 
 *											false	失败 
 *********************************************************************/ 
bool CDbInterface::GetProductInfo(CString productName, PRODUCTINFO &productInfo) 
{ 
	_ConnectionPtr	pConnection; 
	_RecordsetPtr	pRecordset; 
	_variant_t		RecordsAffected;		//影响行数 
	_variant_t		var; 
	CString			SQL; 
	bool			bRet; 
 
	pConnection.CreateInstance(__uuidof(Connection)); 
	pRecordset.CreateInstance(__uuidof(Recordset)); 
 
	bRet = true; 
	try 
	{ 
		SQL.Format("SELECT * FROM smspre_product WHERE productName = \'%s\'", productName);	 
		pConnection->Open((_bstr_t)DATASOURCE, DATAUSER, DATAPWD, adModeUnknown); 
		pRecordset->Open((_variant_t)SQL,        
						pConnection.GetInterfacePtr(),	  
						adOpenDynamic, 
						adLockOptimistic, 
						adCmdText); 
		if(!pRecordset->adoEOF) 
		{ 
			//取得产品ID 
			pRecordset->get_Collect(_variant_t("productId"), (_variant_t*)(&var));			 
			if(var.vt != VT_NULL) 
			{ 
				productInfo.productId = var.iVal; 
			} 
			//取得产品名称 
			pRecordset->get_Collect(_variant_t("productName"), (_variant_t*)(&var));			 
			if(var.vt != VT_NULL) 
			{ 
				productInfo.productName = (LPCSTR)_bstr_t(var); 
			} 
			//取得进入日期 
			pRecordset->get_Collect(_variant_t("entertime"), (_variant_t*)(&var));			 
			if(var.vt != VT_NULL) 
			{ 
				productInfo.entertime = (LPCSTR)_bstr_t(var); 
			} 
		} 
		pRecordset->Close();		 
	} 
	catch(_com_error e) 
	{ 
		/* 加入写LOG文件相关代码 */ 
		bRet = false; 
	} 
	catch(...) 
	{ 
		bRet = false; 
	} 
 
	if(pConnection->State) 
		pConnection->Close(); 
	pConnection = NULL; 
 
	return bRet; 
} 
 
/********************************************************************** 
 * 函数名:	CheckCodeExist 
 * 功  能:  检查防伪号是否存在 
 * 参  数:  CString							防伪号 
 *		 :  bool &							存在标志 	 
 * 返回值:  bool							true	成功 
 *											false	失败 
 *********************************************************************/ 
bool CDbInterface::CheckCodeExist(CString code, bool &existflag) 
{ 
	_ConnectionPtr	pConnection; 
	_RecordsetPtr	pRecordset; 
	_variant_t		RecordsAffected;		//影响行数 
	_variant_t		var; 
	CString			SQL; 
	bool			bRet; 
 
	pConnection.CreateInstance(__uuidof(Connection)); 
	pRecordset.CreateInstance(__uuidof(Recordset)); 
 
	bRet = true; 
	try 
	{ 
		SQL.Format("SELECT * FROM smspre_codelist WHERE code = \'%s\'", code);	 
		pConnection->Open((_bstr_t)DATASOURCE, DATAUSER, DATAPWD, adModeUnknown); 
		pRecordset->Open((_variant_t)SQL,        
						pConnection.GetInterfacePtr(),	  
						adOpenDynamic, 
						adLockOptimistic, 
						adCmdText); 
		if(pRecordset->adoEOF && pRecordset->BOF) 
		{ 
			existflag = false; 
		} 
		else 
		{ 
			existflag = true; 
		} 
		pRecordset->Close();		 
	} 
	catch(_com_error e) 
	{ 
		/* 加入写LOG文件相关代码 */ 
		bRet = false; 
	} 
	catch(...) 
	{ 
		bRet = false; 
	} 
 
	if(pConnection->State) 
		pConnection->Close(); 
	pConnection = NULL; 
 
	return bRet; 
} 
 
/********************************************************************** 
 * 函数名:	AppendNewCode 
 * 功  能:  追加新的防伪号 
 * 参  数:  CODEINFO						防伪信息 	 
 * 返回值:  bool							true	成功 
 *											false	失败 
 *********************************************************************/ 
bool CDbInterface::AppendNewCode(CODEINFO codeinfo) 
{ 
	_ConnectionPtr	pConnection; 
	_variant_t		RecordsAffected;		//影响行数 
	CString			SQL; 
	bool			bRet; 
 
	pConnection.CreateInstance(__uuidof(Connection)); 
 
	try 
	{ 
		pConnection->Open((_bstr_t)DATASOURCE, DATAUSER, DATAPWD, adModeUnknown); 
		SQL.Format("INSERT INTO smspre_codelist(code, querytimes, productId, outflag, stateflag, gentime) VALUES(\'%s\', %d, %d, %d, %d, \'%s\')", 
				codeinfo.code, codeinfo.querytimes, codeinfo.productId, codeinfo.outflag, codeinfo.stateflag, codeinfo.gentime); 
		pConnection->Execute((_bstr_t)SQL, &RecordsAffected, adCmdText); 
 
		bRet = true; 
	} 
	catch(_com_error e) 
	{ 
		bRet = false; 
	} 
	catch(...) 
	{ 
		bRet = false; 
	} 
 
	if(pConnection->State) 
		pConnection->Close(); 
	pConnection = NULL; 
 
	return bRet; 
} 
 
/********************************************************************** 
 * 函数名:	UpdateCodeQueryTimes 
 * 功  能:  更新防伪号查询次数(加1) 
 * 参  数:  CString							防伪号 	 
 * 返回值:  bool							true	成功 
 *											false	失败 
 *********************************************************************/ 
bool CDbInterface::UpdateCodeQueryTimes(CString code) 
{ 
	_ConnectionPtr	pConnection; 
	_variant_t		RecordsAffected;		//影响行数 
	CString			SQL; 
	bool			bRet; 
 
	pConnection.CreateInstance(__uuidof(Connection)); 
 
	try 
	{ 
		pConnection->Open((_bstr_t)DATASOURCE, DATAUSER, DATAPWD, adModeUnknown); 
		SQL.Format("UPDATE smspre_codelist SET querytimes = querytimes + 1 WHERE code = \'%s\'", 
			code); 
		pConnection->Execute((_bstr_t)SQL, &RecordsAffected, adCmdText); 
 
		bRet = true; 
	} 
	catch(_com_error e) 
	{ 
		bRet = false; 
	} 
	catch(...) 
	{ 
		bRet = false; 
	} 
 
	if(pConnection->State) 
		pConnection->Close(); 
	pConnection = NULL; 
 
	return bRet; 
} 
 
/********************************************************************** 
 * 函数名:	GetCodeInfo 
 * 功  能:  取得防伪号信息 
 * 参  数:  CODEINFO &						防伪号信息 
 * 返回值:  bool							true	成功 
 *											false	失败 
 *********************************************************************/ 
bool CDbInterface::GetCodeInfo(CODEINFO &codeinfo) 
{ 
	_ConnectionPtr	pConnection; 
	_RecordsetPtr	pRecordset; 
	_variant_t		RecordsAffected;		//影响行数 
	_variant_t		var; 
	CString			SQL; 
	bool			bRet; 
 
	if(codeinfo.code.IsEmpty()) 
	{ 
		return false; 
	} 
 
	pConnection.CreateInstance(__uuidof(Connection)); 
	pRecordset.CreateInstance(__uuidof(Recordset)); 
 
	bRet = true; 
	try 
	{ 
		SQL.Format("SELECT * FROM smspre_codelist WHERE code = \'%s\'", codeinfo.code);	 
		pConnection->Open((_bstr_t)DATASOURCE, DATAUSER, DATAPWD, adModeUnknown); 
		pRecordset->Open((_variant_t)SQL,        
						pConnection.GetInterfacePtr(),	  
						adOpenDynamic, 
						adLockOptimistic, 
						adCmdText); 
		if(!pRecordset->adoEOF) 
		{ 
			//查询次数 
			pRecordset->get_Collect(_variant_t("querytimes"), (_variant_t*)(&var));			 
			if(var.vt != VT_NULL) 
			{ 
				codeinfo.querytimes = var.iVal; 
			} 
 
			//产品ID 
			pRecordset->get_Collect(_variant_t("productId"), (_variant_t*)(&var));			 
			if(var.vt != VT_NULL) 
			{ 
				codeinfo.productId = var.iVal; 
			} 
 
			//出厂标志 
			pRecordset->get_Collect(_variant_t("productId"), (_variant_t*)(&var));			 
			if(var.vt != VT_NULL) 
			{ 
				codeinfo.productId = var.iVal; 
			} 
 
			//号码状态 
			pRecordset->get_Collect(_variant_t("stateflag"), (_variant_t*)(&var));			 
			if(var.vt != VT_NULL) 
			{ 
				codeinfo.stateflag = var.iVal; 
			} 
 
			//生成批号 
			pRecordset->get_Collect(_variant_t("gentime"), (_variant_t*)(&var));			 
			if(var.vt != VT_NULL) 
			{ 
				codeinfo.gentime = (LPCSTR)_bstr_t(var); 
			} 
		} 
		else 
		{ 
			codeinfo.querytimes = -1; 
		} 
 
		pRecordset->Close();		 
	} 
	catch(_com_error e) 
	{ 
		/* 加入写LOG文件相关代码 */ 
		bRet = false; 
	} 
	catch(...) 
	{ 
		bRet = false; 
	} 
 
	if(pConnection->State) 
		pConnection->Close(); 
	pConnection = NULL; 
 
	return bRet; 
} 
 
/********************************************************************** 
 * 函数名:	AppendQueryRec 
 * 功  能:  追加查询流水记录 
 * 参  数:  QUERYREC						查询记录信息 
 * 返回值:  bool							true	成功 
 *											false	失败 
 *********************************************************************/ 
bool CDbInterface::AppendQueryRec(QUERYREC queryrec) 
{ 
	_ConnectionPtr	pConnection; 
	_variant_t		RecordsAffected;		//影响行数 
	CString			SQL; 
	bool			bRet; 
 
	 
 
	try 
	{ 
		pConnection.CreateInstance(__uuidof(Connection)); 
 
		pConnection->Open((_bstr_t)DATASOURCE, DATAUSER, DATAPWD, adModeUnknown); 
		SQL.Format("INSERT INTO smspre_queryrec(queryer, querytime, queryinfo, dspFlag) VALUES(\'%s\', \'%s\', \'%s\', %ld)", 
				queryrec.queryer, queryrec.querytime, queryrec.queryinfo, UNDSP); 
		pConnection->Execute((_bstr_t)SQL, &RecordsAffected, adCmdText); 
 
		bRet = true; 
	} 
	catch(_com_error e) 
	{ 
		bRet = false; 
	} 
	catch(...) 
	{ 
		bRet = false; 
	} 
 
	if(pConnection->State) 
		pConnection->Close(); 
	pConnection = NULL; 
 
	return bRet; 
} 
 
/********************************************************************** 
 * 函数名:	GetQueryRecList 
 * 功  能:  取得查询记录 
 * 参  数:  std::list&			查询记录信息列表 
 *       :  int								查询条件 
 * 返回值:  bool							true	成功 
 *											false	失败 
 *********************************************************************/ 
bool CDbInterface::GetQueryRecList(std::list& queryRecList,  
								   int dspConditon) 
{ 
	_ConnectionPtr	pConnection; 
	_RecordsetPtr	pRecordset; 
	_variant_t		RecordsAffected;		//影响行数 
	_variant_t		var; 
	CString			SQL; 
	bool			bRet; 
 
	pConnection.CreateInstance(__uuidof(Connection)); 
	pRecordset.CreateInstance(__uuidof(Recordset)); 
 
	bRet = true; 
	try 
	{ 
		SQL.Format("SELECT * FROM smspre_queryrec WHERE dspFlag = %d ORDER BY querytime ASC", dspConditon);	 
		pConnection->Open((_bstr_t)DATASOURCE, DATAUSER, DATAPWD, adModeUnknown); 
		pRecordset->Open((_variant_t)SQL,        
						pConnection.GetInterfacePtr(),	  
						adOpenDynamic, 
						adLockOptimistic, 
						adCmdText); 
		queryRecList.clear(); 
		while(!pRecordset->adoEOF) 
		{ 
			QUERYREC queryRec; 
			//取得查询者 
			pRecordset->get_Collect(_variant_t("queryer"), (_variant_t*)(&var));			 
			if(var.vt != VT_NULL) 
			{ 
				queryRec.queryer = (LPCSTR)_bstr_t(var); 
			} 
			//取得查询时间 
			pRecordset->get_Collect(_variant_t("querytime"), (_variant_t*)(&var));			 
			if(var.vt != VT_NULL) 
			{ 
				queryRec.querytime = (LPCSTR)_bstr_t(var); 
			} 
			//取得查询的防伪号 
			pRecordset->get_Collect(_variant_t("queryinfo"), (_variant_t*)(&var));			 
			if(var.vt != VT_NULL) 
			{ 
				queryRec.queryinfo = (LPCSTR)_bstr_t(var); 
			} 
			//取得显示标志 
			pRecordset->get_Collect(_variant_t("dspFlag"), (_variant_t*)(&var));			 
			if(var.vt != VT_NULL) 
			{ 
				queryRec.dspFlag = var.iVal; 
			} 
 
			queryRecList.push_back(queryRec); 
 
			/* 更新状态 */ 
			if(dspConditon == UNDSP) 
			{ 
				pRecordset->put_Collect(_variant_t("dspFlag"), _variant_t("1")); 
				pRecordset->Update(); 
			} 
 
			//称动指针 
			pRecordset->MoveNext(); 
		} 
		pRecordset->Close();		 
	} 
	catch(_com_error e) 
	{ 
		/* 加入写LOG文件相关代码 */ 
		bRet = false; 
	} 
	catch(...) 
	{ 
		bRet = false; 
	} 
 
	if(pConnection->State) 
		pConnection->Close(); 
	pConnection = NULL; 
 
	return bRet; 
} 
 
/********************************************************************** 
 * 函数名:	GetCodeList 
 * 功  能:  取得防伪号列表 
 * 参  数:  CString							查询SQL 
 *       :  std::list &			结果列表 
 * 返回值:  bool							true	成功 
 *											false	失败 
 *********************************************************************/ 
bool CDbInterface::GetCodeList(CString sql,  
							   std::list &codeinfolist) 
{ 
	_ConnectionPtr	pConnection; 
	_RecordsetPtr	pRecordset; 
	_variant_t		RecordsAffected;		//影响行数 
	_variant_t		var; 
	CString			SQL; 
	bool			bRet; 
 
	pConnection.CreateInstance(__uuidof(Connection)); 
	pRecordset.CreateInstance(__uuidof(Recordset)); 
 
	bRet = true; 
	try 
	{ 
		SQL.Format("%s", sql);	 
		pConnection->Open((_bstr_t)DATASOURCE, DATAUSER, DATAPWD, adModeUnknown); 
		pRecordset->Open((_variant_t)SQL,        
						pConnection.GetInterfacePtr(),	  
						adOpenDynamic, 
						adLockOptimistic, 
						adCmdText); 
		codeinfolist.clear(); 
		while(!pRecordset->adoEOF) 
		{ 
			CODEINFO codeinfo; 
			//取得防伪码 
			pRecordset->get_Collect(_variant_t("code"), (_variant_t*)(&var));			 
			if(var.vt != VT_NULL) 
			{ 
				codeinfo.code = (LPCSTR)_bstr_t(var); 
			} 
			//取得查询次数 
			pRecordset->get_Collect(_variant_t("querytimes"), (_variant_t*)(&var));			 
			if(var.vt != VT_NULL) 
			{ 
				codeinfo.querytimes = var.iVal; 
			} 
			//取得产品ID 
			pRecordset->get_Collect(_variant_t("productId"), (_variant_t*)(&var));			 
			if(var.vt != VT_NULL) 
			{ 
				codeinfo.productId = var.iVal; 
			} 
			//取得出厂标志 
			pRecordset->get_Collect(_variant_t("outflag"), (_variant_t*)(&var));			 
			if(var.vt != VT_NULL) 
			{ 
				codeinfo.outflag = var.iVal; 
			} 
			//取得号码状态 
			pRecordset->get_Collect(_variant_t("stateflag"), (_variant_t*)(&var));			 
			if(var.vt != VT_NULL) 
			{ 
				codeinfo.stateflag = var.iVal; 
			} 
			//取得生成批号 
			pRecordset->get_Collect(_variant_t("gentime"), (_variant_t*)(&var));			 
			if(var.vt != VT_NULL) 
			{ 
				codeinfo.gentime = (LPCSTR)_bstr_t(var); 
			} 
 
			codeinfolist.push_back(codeinfo); 
 
			//移动指针 
			pRecordset->MoveNext(); 
		} 
		pRecordset->Close();		 
	} 
	catch(_com_error e) 
	{ 
		/* 加入写LOG文件相关代码 */ 
		bRet = false; 
	} 
	catch(...) 
	{ 
		bRet = false; 
	} 
 
	if(pConnection->State) 
		pConnection->Close(); 
	pConnection = NULL; 
 
	return bRet; 
} 
 
/********************************************************************** 
 * 函数名:	GetQueryedCodeList 
 * 功  能:  取得已查询过的号码列表 
 * 参  数:  std::list &			结果列表 
 * 返回值:  bool							true	成功 
 *											false	失败 
 *********************************************************************/ 
bool CDbInterface::GetQueryedCodeList(std::list &codeinfolist) 
{ 
	CString sql; 
 
	sql.Format("SELECT * FROM smspre_codelist WHERE querytimes > 0 AND stateflag = %d", 
		OKCODE); 
 
	return GetCodeList(sql, codeinfolist); 
} 
 
/********************************************************************** 
 * 函数名:	GetProductInfo 
 * 功  能:  取得产品信息 
 * 参  数:  int								产品ID 
 *		 :  PRODUCTINFO &					产品信息 	 
 * 返回值:  bool							true	成功 
 *											false	失败 
 *********************************************************************/ 
bool CDbInterface::GetProductInfo(int productId, PRODUCTINFO &productInfo) 
{ 
	_ConnectionPtr	pConnection; 
	_RecordsetPtr	pRecordset; 
	_variant_t		RecordsAffected;		//影响行数 
	_variant_t		var; 
	CString			SQL; 
	bool			bRet; 
 
	pConnection.CreateInstance(__uuidof(Connection)); 
	pRecordset.CreateInstance(__uuidof(Recordset)); 
 
	bRet = true; 
	try 
	{ 
		SQL.Format("SELECT * FROM smspre_product WHERE productId = %d", productId);	 
		pConnection->Open((_bstr_t)DATASOURCE, DATAUSER, DATAPWD, adModeUnknown); 
		pRecordset->Open((_variant_t)SQL,        
						pConnection.GetInterfacePtr(),	  
						adOpenDynamic, 
						adLockOptimistic, 
						adCmdText); 
		if(!pRecordset->adoEOF) 
		{ 
			//取得产品ID 
			pRecordset->get_Collect(_variant_t("productId"), (_variant_t*)(&var));			 
			if(var.vt != VT_NULL) 
			{ 
				productInfo.productId = var.iVal; 
			} 
			//取得产品名称 
			pRecordset->get_Collect(_variant_t("productName"), (_variant_t*)(&var));			 
			if(var.vt != VT_NULL) 
			{ 
				productInfo.productName = (LPCSTR)_bstr_t(var); 
			} 
			//取得进入日期 
			pRecordset->get_Collect(_variant_t("entertime"), (_variant_t*)(&var));			 
			if(var.vt != VT_NULL) 
			{ 
				productInfo.entertime = (LPCSTR)_bstr_t(var); 
			} 
		} 
		pRecordset->Close();		 
	} 
	catch(_com_error e) 
	{ 
		/* 加入写LOG文件相关代码 */ 
		bRet = false; 
	} 
	catch(...) 
	{ 
		bRet = false; 
	} 
 
	if(pConnection->State) 
		pConnection->Close(); 
	pConnection = NULL; 
 
	return bRet; 
} 
 
/********************************************************************** 
 * 函数名:	GetQueryedMulCodeList 
 * 功  能:  取得多次查询过的号码列表 
 * 参  数:  std::list &			结果列表 
 * 返回值:  bool							true	成功 
 *											false	失败 
 *********************************************************************/ 
bool CDbInterface::GetQueryedMulCodeList(std::list &codeinfolist) 
{ 
	CString sql; 
 
	sql.Format("SELECT * FROM smspre_codelist WHERE querytimes > 1 AND stateflag = %d", 
		OKCODE); 
 
	return GetCodeList(sql, codeinfolist); 
} 
 
/********************************************************************** 
 * 函数名:	GetQueryedMulCodeList 
 * 功  能:  取得假冒号码列表 
 * 参  数:  std::list &			结果列表 
 * 返回值:  bool							true	成功 
 *											false	失败 
 *********************************************************************/ 
bool CDbInterface::GetInvalidationCodeList(std::list &codeinfolist) 
{ 
	CString sql; 
 
	sql.Format("SELECT * FROM smspre_codelist WHERE stateflag = %d", 
		NGCODE); 
 
	return GetCodeList(sql, codeinfolist); 
}