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

📄 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;
	nFieldRows=0;
	nFieldCols=0;

	m_pConn.CreateInstance(__uuidof(Connection));
	m_pRst.CreateInstance(__uuidof(Recordset));
}

MyRecordSet::MyRecordSet(CString m_strDataType)
{
	MyRecordSet();
	ADOOpen(m_strDataType);
}

bool MyRecordSet::ADOOpen(CString m_strDataType)
{
	if(isConn)
		m_pConn->Close();

	try{
		//选择不同的数据库连接 ACCESS和SQLServer
		if(m_strDataType=="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);
		}
	}
	catch(...){
		AfxMessageBox("与数据建立连接失败!");
		return false;
	}

	//使游标在客户端,才能取出行,列数
	m_pRst->CursorLocation = adUseClient;

	isConn=true;
	return true;
}


MyRecordSet::~MyRecordSet()
{
	try{
		m_pRst->Close();
	}
	catch(...){}

	try{
		m_pConn->Close();
	}
	catch(...){}
}

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

	m_pRst->Open(sql,m_pConn.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);

	bool r=false;	//判断是否有返回值
	if(m_pRst->State)
	{
		nFieldRows=m_pRst->RecordCount;
		nFieldCols=m_pRst->GetFields()->GetCount();
		
		r=true;	
	}
	return r;
}

bool MyRecordSet::ADOExcute(CString strSQL)
{
	m_strSQL=strSQL;
	return ADOExcute();
}

void MyRecordSet::ADOClose()
{
	try{
		m_pRst->Close();
	}
	catch(...){}
}

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::GetFieldString(int nCol)
{
	_variant_t var;
	try{
		var=m_pRst->GetCollect((long)nCol);
	}
	catch(...)
	{
		AfxMessageBox("读取数据失败");
		return "";
	}

   	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;
}

//以整型类型返回数据集中的值
int MyRecordSet::GetFieldNumber(int nCol)
{
	_variant_t var;
	try{
		var=m_pRst->GetCollect((long)nCol);
	}
	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);
}

⌨️ 快捷键说明

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