📄 myrecordset.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);
}
//以浮点类型返回数据集中的值,传入的是字段名
float MyRecordSet::GetFieldFloat(CString strField)
{
_variant_t vField=strField;
_variant_t var;
try{
var=m_pRst->GetCollect(vField);
}
catch(...)
{
AfxMessageBox("读取数据失败");
return 0;
}
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 + -