ado中的数据类型被读取到_variant_t结构中。
举例如下:
_variant_t vParam;
vParam=m_pRecordset->GetCollect("字段A");
若字段A为整型:
int i;
i=vParam.iVal;
若字段A为字符型:
CString str;
str=vParam.bstrVal;
若字段A为时间类型:
COleDateTime sqlTime(vParam);
//CTime-->_variant_t
CTime time(CTime::GetCurrentTime());
SYSTEMTIME timeDest;
time.GetAsSystemTime(timeDest);
double vtime;
SystemTimeToVariantTime(&timeDest,&vtime);
_variant_t var_time(vtime,VT_DATE);
// COleCurrency ---> double
COleCurrency m_cur(4,500);
double dval = ((double)m_cur.m_cur.int64)/10000;
CString s;
s.Format("%.4f",dval);
AfxMessageBox(s);
SAFEARRAY* psa;
SAFEARRAYBOUND bounds = {8, 0};
psa = SafeArrayCreate(VT_BSTR, 1, &bounds);
BSTR* bstrArray;
SafeArrayAccessData(psa, reinterpret_cast<void**>(&bstrArray));
int i = 0;
for(it = 0; it != 8; it++, i++)
{
bstrArray[i] = SysAllocString(T2OLE("VALUES"));
}
SafeArrayUnaccessData(psa);
该程序段说明了如何从字段检索数值并将数值转换为 C++ 变量。
#import "c:/Program Files/Common Files/System/ADO/msado15.dll"
no_namespace rename("EOF", "EndOfFile")
#include <stdio.h>
Class CEmployee
{
public:
FetchEmployeeData();
char m_szFirstName[30];
char m_szLastName[30];
int nAge;
};
CEmployee::FetchEmployeeData()
{
_ConnectionPtr pCon();
_RecordsetPtr pRs();
FieldPtr pfldFirstName, pfldLastName, pfldAge;
_variant_t vFirstName, vLastName, vAge;
pCon.CreateInstance(__uuidof(Connection));
pCon->Open(“pubs”, “sa”, “”);
pRs.CreateInstance(__uuidof(Recordset));
pRs->Open(“select FirstName, LastName, Age from Employees”, pCon,
adOpenForwardOnly, adLockReadOnly, adCmdUnknown);
pfldFirstName = pRs->Fields->GetItem(0);
pfldLastName = pRs->Fields->GetItem(1);
pfldAge = pRs->Fields->GetItem(2);
while (VARIANT_FALSE == pRs->EndOfFile)
{
vFirstName.Clear();
vLastName.Clear();
vAge.Clear();
vFirstName = pfldFirstName->Value;
WideCharToMultiByte(CP_ACP, 0, vFirstName.bstrVal, -1,
m_szFirstName, sizeof(m_szFirstName), NULL, NULL);
vLastName = pfldLastName->Value;
WideCharToMultiByte(CP_ACP, 0, vLastName.bstrVal, -1,
m_szLastName, sizeof(m_szLastName), NULL, NULL);
nAge = vAge.iVal;
pRs->MoveNext();
}
}
举例如下:
_variant_t vParam;
vParam=m_pRecordset->GetCollect("字段A");
若字段A为整型:
int i;
i=vParam.iVal;
若字段A为字符型:
CString str;
str=vParam.bstrVal;
若字段A为时间类型:
COleDateTime sqlTime(vParam);
//CTime-->_variant_t
CTime time(CTime::GetCurrentTime());
SYSTEMTIME timeDest;
time.GetAsSystemTime(timeDest);
double vtime;
SystemTimeToVariantTime(&timeDest,&vtime);
_variant_t var_time(vtime,VT_DATE);
// COleCurrency ---> double
COleCurrency m_cur(4,500);
double dval = ((double)m_cur.m_cur.int64)/10000;
CString s;
s.Format("%.4f",dval);
AfxMessageBox(s);
SAFEARRAY* psa;
SAFEARRAYBOUND bounds = {8, 0};
psa = SafeArrayCreate(VT_BSTR, 1, &bounds);
BSTR* bstrArray;
SafeArrayAccessData(psa, reinterpret_cast<void**>(&bstrArray));
int i = 0;
for(it = 0; it != 8; it++, i++)
{
bstrArray[i] = SysAllocString(T2OLE("VALUES"));
}
SafeArrayUnaccessData(psa);
该程序段说明了如何从字段检索数值并将数值转换为 C++ 变量。
#import "c:/Program Files/Common Files/System/ADO/msado15.dll"
no_namespace rename("EOF", "EndOfFile")
#include <stdio.h>
Class CEmployee
{
public:
FetchEmployeeData();
char m_szFirstName[30];
char m_szLastName[30];
int nAge;
};
CEmployee::FetchEmployeeData()
{
_ConnectionPtr pCon();
_RecordsetPtr pRs();
FieldPtr pfldFirstName, pfldLastName, pfldAge;
_variant_t vFirstName, vLastName, vAge;
pCon.CreateInstance(__uuidof(Connection));
pCon->Open(“pubs”, “sa”, “”);
pRs.CreateInstance(__uuidof(Recordset));
pRs->Open(“select FirstName, LastName, Age from Employees”, pCon,
adOpenForwardOnly, adLockReadOnly, adCmdUnknown);
pfldFirstName = pRs->Fields->GetItem(0);
pfldLastName = pRs->Fields->GetItem(1);
pfldAge = pRs->Fields->GetItem(2);
while (VARIANT_FALSE == pRs->EndOfFile)
{
vFirstName.Clear();
vLastName.Clear();
vAge.Clear();
vFirstName = pfldFirstName->Value;
WideCharToMultiByte(CP_ACP, 0, vFirstName.bstrVal, -1,
m_szFirstName, sizeof(m_szFirstName), NULL, NULL);
vLastName = pfldLastName->Value;
WideCharToMultiByte(CP_ACP, 0, vLastName.bstrVal, -1,
m_szLastName, sizeof(m_szLastName), NULL, NULL);
nAge = vAge.iVal;
pRs->MoveNext();
}
}