?? 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);
}
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 + -