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

📄 myrecordset.cpp

📁 内容包括从VC++的基本范例到项目开发的许多典型的例子。是VC++初学者不可多得的好资料
💻 CPP
字号:
// MyRecordSet.cpp: implementation of the MyRecordSet class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "ExMIS.h"
#include "MyRecordSet.h"

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

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
//建立新对象
MyRecordSet::MyRecordSet()
{	
	isConn=false;
	isOpen=false;

	nFieldRows=0;
	nFieldCols=0;

	try{
		m_pConn.CreateInstance(__uuidof(Connection));
		m_pRst.CreateInstance(__uuidof(Recordset));
	}
	catch(...)
	{
	}
}

MyRecordSet::~MyRecordSet()
{
	if(isOpen) m_pRst->Close();

	if(isConn) m_pConn->Close();	
}

bool MyRecordSet::ADOOpen(CString strDataType)
{
	m_strDBType=strDataType;
	return ADOOpen();
}

//建立数据库连接
bool MyRecordSet::ADOOpen()
{	
	ADOConnectionClose();

	isConn=false;
	try{
		//选择不同的数据库连接 ACCESS和SQLServer
		if(m_strDBType=="ACCESS")
		{
			m_pConn->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=StuMIS.mdb","","",-1);
		}
		else
		{		
			m_pConn->Open("Provider=SQLOLEDB.1;Password=123;Persist Security Info=True;User ID=sa;Initial Catalog=StuMIS;Data Source=ab98b11efbae45b","","",-1);
		}
		//使游标在客户端,才能取出行,列数
		m_pRst->CursorLocation = adUseClient;
		isConn=true;	//连接成绩
	}
	catch(...){
		AfxMessageBox("与数据建立连接失败!");		
	}
	
	return isConn;
}

//执行SQL语句,返回数据集,主要针对查询
bool MyRecordSet::ADOExcute(CString strSQL)
{
	m_strSQL=strSQL;
	return ADOExcute();
}

/*
是第二个参数的意义:
  _RecordsetPtr   Connection15::Execute   (   _bstr_t   CommandText,   VARIANT   *   RecordsAffected,   long   Options   )   
      
  其中CommandText是命令字串,通常是SQL命令。   
  参数RecordsAffected是操作完成后所影响的行数,     
  参数Options表示CommandText中内容的类型,Options可以取如下值之一:   
    adCmdText:表明CommandText是文本命令   
    adCmdTable:表明CommandText是一个表名   
    adCmdProc:表明CommandText是一个存储过程   
    adCmdUnknown:未知
*/
//执行SQL语句,返回受影响的行数,主要针对增删改
int MyRecordSet::ADOExcuteNoQuery(CString strSQL)
{
	_variant_t  var;
	_bstr_t sql=strSQL;
	try{
		m_pConn->Execute(sql,&var,adCmdText);
		return (int)V_I2(&var);
	}
	catch(...){
		return 0;
	}
}

bool MyRecordSet::ADOExcute()
{
	//声明对象	
	_variant_t sql=m_strSQL;
	nFieldRows=0;
	nFieldCols=0;

	ADOClose();

	isOpen=false;
	try{
		m_pRst->Open(sql,m_pConn.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);

		if(m_pRst->State)
		{
			nFieldRows=m_pRst->RecordCount;
			nFieldCols=m_pRst->GetFields()->GetCount();

			isOpen=true;
		}
	}
	catch(...)
	{}
	return isOpen;
}

void MyRecordSet::ADOClose()
{
	if(isOpen)
	{
		m_pRst->Close();
		isOpen=false;
	}	
}

void MyRecordSet::ADOConnectionClose()
{
	//只有先关闭数据集才能再关闭连接
	ADOClose();
	if(isConn)
	{
		m_pConn->Close();
		isConn=false;
	}
}

//返回是否数据集结尾
bool MyRecordSet::ADOEOF()
{
	if(isConn&&isOpen)
		return m_pRst->adoEOF;
	return true;
}

HRESULT MyRecordSet::MoveFirst()
{
	return m_pRst->MoveFirst();
}

HRESULT MyRecordSet::MoveLast()
{
	return m_pRst->MoveLast();
}

HRESULT MyRecordSet::MovePrev()
{
	return m_pRst->MovePrevious();
}

HRESULT MyRecordSet::MoveNext()
{
	return m_pRst->MoveNext();
}

//返回字段名称
CString MyRecordSet::GetFieldName(int nCol)
{
	CString sValue;
	_variant_t vValue;
	vValue=m_pRst->GetFields()->GetItem((long)nCol)->Name;
	if(vValue.vt==VT_EMPTY||vValue.vt==VT_NULL)
		sValue="";
	else
		sValue=(char*)(_bstr_t)vValue;
	sValue.TrimLeft();
	sValue.TrimRight();
	return sValue;
}

//以字符串类型返回数据集中的值,传入的是字段名称
CString MyRecordSet::GetFieldString(CString strFieldName)
{
	_variant_t strField=strFieldName;
	_variant_t var;
	try{
		var=m_pRst->GetCollect(strField);
	}
	catch(...)
	{
		AfxMessageBox("读取数据失败");
		return "";
	}

   	return VariantToCString(var);
}

//以字符串类型返回数据集中的值,传入的是列的序号
CString MyRecordSet::GetFieldString(int nCol)
{
	_variant_t var;
	try{
		var=m_pRst->GetCollect((long)nCol);
	}
	catch(...)
	{
		AfxMessageBox("读取数据失败");
		return "";
	}
	return VariantToCString(var);
}

//以整型类型返回数据集中的值,传入的是字段序号
int MyRecordSet::GetFieldNumber(int nCol)
{
	_variant_t var;
	try{
		var=m_pRst->GetCollect((long)nCol);
	}
	catch(...)
	{
		AfxMessageBox("读取数据失败");
		return 0;
	}

	return (int)V_I2(&var);
}

//以整型类型返回数据集中的值,传入的是字段名
int MyRecordSet::GetFieldNumber(CString strFieldName)
{
	_variant_t strField=strFieldName;
	_variant_t var;
	try{
		var=m_pRst->GetCollect(strField);
	}
	catch(...)
	{
		AfxMessageBox("读取数据失败");
		return 0;
	}

	return (int)V_I2(&var);
}

//以浮点类型返回数据集中的值
float MyRecordSet::GetFieldFloat(int nCol)
{
	_variant_t var;
	try{
		var=m_pRst->GetCollect((long)nCol);
	}

	catch(...)
	{
		AfxMessageBox("读取数据失败");
		return 0;
	}

	/*  
	VT_I4:是长整型,通过V_I4(&var)可以获得其值。
	VT_R8:是双精度型,通过V_R8(&var)可以获得其值。
	*/
	return (float)V_R4(&var);
}

CString MyRecordSet::VariantToCString(VARIANT var)
{
   	CString strValue;
	_variant_t var_t;
	_bstr_t bst_t;
	time_t cur_time;
	CTime time_value;
	COleCurrency var_currency;
	switch(var.vt)
	{
	case VT_EMPTY:strValue=_T("");break;
	case VT_UI1:strValue.Format ("%d",var.bVal);break;
	case VT_I2:strValue.Format ("%d",var.iVal );break;
	case VT_I4:strValue.Format ("%d",var.lVal);break;
	case VT_R4:strValue.Format ("%f",var.fltVal);break;
	case VT_R8:strValue.Format ("%f",var.dblVal);break;
	case VT_CY:
		var_currency=var;
		strValue=var_currency.Format(0);
		break;
	case VT_BSTR:
		var_t=var;
		bst_t=var_t;
		strValue.Format ("%s",(const char*)bst_t);
		break;
	case VT_NULL:strValue=_T("");break;
	case VT_DATE:
		cur_time=var.date;
		time_value=cur_time;
        strValue=time_value.Format("%Y-%m-%d");
		break;
	case VT_BOOL:strValue.Format ("%d",var.boolVal );break;
	default:strValue=_T("");break;
	}
	return strValue;
}

//数据库中常用的两个类型转换
//时间到字符串
CString MyRecordSet::TimeToString(CTime time)
{
	CString   str;
	str=time.Format("%Y-%m-%d");
	return str;
}

//字符串到时间
CTime MyRecordSet::StringToTime(CString str)
{
	if(str==NULL||str=="")
		str="1970-1-1";
	int   y,m,d;	
	y=atoi(str); 
	int   i,j;   
	i=str.Find('-',0);
	j=str.Find('-',i+1);
	CString   temp;   
	while(i<j-1)   
		temp+=str.GetAt(++i);   
	m=atoi(temp);
	temp.Empty();   
	i=str.GetLength();    
	while(j<i-1)   
		temp+=str.GetAt(++j);   
	d=atoi(temp);
	str.Format("%d-%d-%d",y,m,d);
	AfxMessageBox(str);
	CTime mytime(y,m,d,0,0,0);	
	return mytime;
}

⌨️ 快捷键说明

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