📄 daodfx.cpp
字号:
#endif //_DEBUG
}
}
void AFXAPI DFX_Bool(CDaoFieldExchange* pFX, LPCTSTR lpszName,
BOOL& value, DWORD dwBindOptions)
{
(pFX->m_nFieldType == CDaoFieldExchange::outputColumn) ?
++pFX->m_nField: ++pFX->m_nParam;
// Do nothing if op not supported for outputColumn or param type
if (!pFX->IsValidOperation())
return;
// Mark as CACHE_BY_VALUE (size <= sizeof(void*))
dwBindOptions |= AFX_DAO_CACHE_BY_VALUE;
switch (pFX->m_nOperation)
{
case CDaoFieldExchange::BindField:
{
LPDAOCOLUMNBINDING pcb =
&pFX->m_prs->m_prgDaoColBindInfo[pFX->m_nField-1];
pcb->dwDataType = DAO_BOOL;
pcb->dwBinding = DAOBINDING_DIRECT;
pcb->cbDataOffset = (DWORD)&value;
pcb->dwUser = 0;
pcb->cbMaxLen = sizeof(value);
pFX->m_prs->m_cbFixedLengthFields += pcb->cbMaxLen;
}
// Fall through to finish setting up column binding struct
default:
pFX->Default(lpszName, (void*)&value, AFX_RFX_BOOL,
dwBindOptions);
return;
case CDaoFieldExchange::Fixup:
// Convert BOOL value from AFX_DAO_TRUE/FALSE to TRUE/FALSE
value = (value != AFX_DAO_FALSE);
pFX->Default(lpszName, (void*)&value,
AFX_RFX_BOOL, dwBindOptions);
return;
#ifdef _DEBUG
case CDaoFieldExchange::DumpField:
*pFX->m_pdcDump << "\n" << lpszName << " = " << value;
return;
#endif //_DEBUG
}
}
void AFXAPI DFX_Byte(CDaoFieldExchange* pFX, LPCTSTR lpszName,
BYTE& value, DWORD dwBindOptions)
{
(pFX->m_nFieldType == CDaoFieldExchange::outputColumn) ?
++pFX->m_nField: ++pFX->m_nParam;
// Do nothing if op not supported for outputColumn or param type
if (!pFX->IsValidOperation())
return;
// Mark as CACHE_BY_VALUE (size <= sizeof(void*))
dwBindOptions |= AFX_DAO_CACHE_BY_VALUE;
switch (pFX->m_nOperation)
{
case CDaoFieldExchange::BindField:
{
LPDAOCOLUMNBINDING pcb =
&pFX->m_prs->m_prgDaoColBindInfo[pFX->m_nField-1];
pcb->dwDataType = DAO_BYTE;
pcb->dwBinding = DAOBINDING_DIRECT;
pcb->cbDataOffset = (DWORD)&value;
pcb->dwUser = 0;
pcb->cbMaxLen = sizeof(value);
pFX->m_prs->m_cbFixedLengthFields += pcb->cbMaxLen;
}
// Fall through to finish setting up column binding struct
default:
pFX->Default(lpszName, (void*)&value, AFX_RFX_BYTE,
dwBindOptions);
return;
#ifdef _DEBUG
case CDaoFieldExchange::DumpField:
*pFX->m_pdcDump << "\n" << lpszName << " = " << value;
return;
#endif //_DEBUG
}
}
void AFXAPI DFX_Short(CDaoFieldExchange* pFX, LPCTSTR lpszName,
short& value, DWORD dwBindOptions)
{
(pFX->m_nFieldType == CDaoFieldExchange::outputColumn) ?
++pFX->m_nField: ++pFX->m_nParam;
// Do nothing if op not supported for outputColumn or param type
if (!pFX->IsValidOperation())
return;
// Mark as CACHE_BY_VALUE (size <= sizeof(void*))
dwBindOptions |= AFX_DAO_CACHE_BY_VALUE;
switch (pFX->m_nOperation)
{
case CDaoFieldExchange::BindField:
{
LPDAOCOLUMNBINDING pcb =
&pFX->m_prs->m_prgDaoColBindInfo[pFX->m_nField-1];
pcb->dwDataType = DAO_I2;
pcb->dwBinding = DAOBINDING_DIRECT;
pcb->cbDataOffset = (DWORD)&value;
pcb->dwUser = 0;
pcb->cbMaxLen = sizeof(value);
pFX->m_prs->m_cbFixedLengthFields += pcb->cbMaxLen;
}
// Fall through to finish setting up column binding struct
default:
pFX->Default(lpszName, (void*)&value, AFX_RFX_SHORT,
dwBindOptions);
return;
#ifdef _DEBUG
case CDaoFieldExchange::DumpField:
*pFX->m_pdcDump << "\n" << lpszName << " = " << value;
return;
#endif //_DEBUG
}
}
void AFXAPI DFX_Long(CDaoFieldExchange* pFX, LPCTSTR lpszName,
long& value, DWORD dwBindOptions)
{
(pFX->m_nFieldType == CDaoFieldExchange::outputColumn) ?
++pFX->m_nField: ++pFX->m_nParam;
// Do nothing if op not supported for outputColumn or param type
if (!pFX->IsValidOperation())
return;
// Mark as CACHE_BY_VALUE (size <= sizeof(void*))
dwBindOptions |= AFX_DAO_CACHE_BY_VALUE;
switch (pFX->m_nOperation)
{
case CDaoFieldExchange::BindField:
{
LPDAOCOLUMNBINDING pcb =
&pFX->m_prs->m_prgDaoColBindInfo[pFX->m_nField-1];
pcb->dwDataType = DAO_I4;
pcb->dwBinding = DAOBINDING_DIRECT;
pcb->cbDataOffset = (DWORD)&value;
pcb->dwUser = 0;
pcb->cbMaxLen = sizeof(value);
pFX->m_prs->m_cbFixedLengthFields += pcb->cbMaxLen;
}
// Fall through to finish setting up column binding struct
default:
pFX->Default(lpszName, (void*)&value, AFX_RFX_LONG,
dwBindOptions);
return;
#ifdef _DEBUG
case CDaoFieldExchange::DumpField:
*pFX->m_pdcDump << "\n" << lpszName << " = " << value;
return;
#endif //_DEBUG
}
}
void AFXAPI DFX_Currency(CDaoFieldExchange* pFX, LPCTSTR lpszName,
COleCurrency& value, DWORD dwBindOptions)
{
(pFX->m_nFieldType == CDaoFieldExchange::outputColumn) ?
++pFX->m_nField: ++pFX->m_nParam;
// Do nothing if op not supported for outputColumn or param type
if (!pFX->IsValidOperation())
return;
switch (pFX->m_nOperation)
{
case CDaoFieldExchange::BindField:
{
LPDAOCOLUMNBINDING pcb =
&pFX->m_prs->m_prgDaoColBindInfo[pFX->m_nField-1];
pcb->dwDataType = DAO_CURRENCY;
pcb->dwBinding = DAOBINDING_DIRECT;
pcb->cbDataOffset = (DWORD)&value.m_cur;
pcb->dwUser = 0;
pcb->cbMaxLen = sizeof(CURRENCY);
pFX->m_prs->m_cbFixedLengthFields += pcb->cbMaxLen;
// Finish setting up column binding struct
pFX->Default(lpszName, (void*)&value, AFX_RFX_CURRENCY,
dwBindOptions);
return;
}
case CDaoFieldExchange::Fixup:
// Must reset the valid currency flag
if (pFX->m_prs->GetFieldLength(pFX->m_nField-1) == DAO_NULL)
value.SetStatus(COleCurrency::null);
else
value.SetStatus(COleCurrency::valid);
// Fall through to reset the NULL status
default:
pFX->Default(lpszName, (void*)&value, AFX_RFX_CURRENCY,
dwBindOptions);
return;
#ifdef _DEBUG
case CDaoFieldExchange::DumpField:
*pFX->m_pdcDump << "\n" << lpszName << ":" << value;
return;
#endif //_DEBUG
}
}
void AFXAPI DFX_Single(CDaoFieldExchange* pFX, LPCTSTR lpszName,
float& value, DWORD dwBindOptions)
{
(pFX->m_nFieldType == CDaoFieldExchange::outputColumn) ?
++pFX->m_nField: ++pFX->m_nParam;
// Do nothing if op not supported for outputColumn or param type
if (!pFX->IsValidOperation())
return;
// Mark as CACHE_BY_VALUE (size <= sizeof(void*))
dwBindOptions |= AFX_DAO_CACHE_BY_VALUE;
switch (pFX->m_nOperation)
{
case CDaoFieldExchange::BindField:
{
LPDAOCOLUMNBINDING pcb =
&pFX->m_prs->m_prgDaoColBindInfo[pFX->m_nField-1];
pcb->dwDataType = DAO_R4;
pcb->dwBinding = DAOBINDING_DIRECT;
pcb->cbDataOffset = (DWORD)&value;
pcb->dwUser = 0;
pcb->cbMaxLen = sizeof(value);
pFX->m_prs->m_cbFixedLengthFields += pcb->cbMaxLen;
}
// Fall through to finish setting up column binding struct
default:
pFX->Default(lpszName, (void*)&value, AFX_RFX_SINGLE,
dwBindOptions);
return;
#ifdef _DEBUG
case CDaoFieldExchange::DumpField:
*pFX->m_pdcDump << "\n" << lpszName << " = " << value;
return;
#endif //_DEBUG
}
}
void AFXAPI DFX_Double(CDaoFieldExchange* pFX, LPCTSTR lpszName,
double& value, DWORD dwBindOptions)
{
(pFX->m_nFieldType == CDaoFieldExchange::outputColumn) ?
++pFX->m_nField: ++pFX->m_nParam;
// Do nothing if op not supported for outputColumn or param type
if (!pFX->IsValidOperation())
return;
switch (pFX->m_nOperation)
{
case CDaoFieldExchange::BindField:
{
LPDAOCOLUMNBINDING pcb =
&pFX->m_prs->m_prgDaoColBindInfo[pFX->m_nField-1];
pcb->dwDataType = DAO_R8;
pcb->dwBinding = DAOBINDING_DIRECT;
pcb->cbDataOffset = (DWORD)&value;
pcb->dwUser = 0;
pcb->cbMaxLen = sizeof(value);
pFX->m_prs->m_cbFixedLengthFields += pcb->cbMaxLen;
}
// Fall through to finish setting up column binding struct
default:
pFX->Default(lpszName, (void*)&value, AFX_RFX_DOUBLE,
dwBindOptions);
return;
#ifdef _DEBUG
case CDaoFieldExchange::DumpField:
*pFX->m_pdcDump << "\n" << lpszName << " = " << value;
return;
#endif //_DEBUG
}
}
void AFXAPI DFX_DateTime(CDaoFieldExchange* pFX, LPCTSTR lpszName,
COleDateTime& value, DWORD dwBindOptions)
{
(pFX->m_nFieldType == CDaoFieldExchange::outputColumn) ?
++pFX->m_nField: ++pFX->m_nParam;
// Do nothing if op not supported for outputColumn or param type
if (!pFX->IsValidOperation())
return;
switch (pFX->m_nOperation)
{
case CDaoFieldExchange::BindField:
{
LPDAOCOLUMNBINDING pcb =
&pFX->m_prs->m_prgDaoColBindInfo[pFX->m_nField-1];
pcb->dwDataType = DAO_DATE;
pcb->dwBinding = DAOBINDING_DIRECT;
pcb->cbDataOffset = (DWORD)&value.m_dt;
pcb->dwUser = 0;
pcb->cbMaxLen = sizeof(DATE);
pFX->m_prs->m_cbFixedLengthFields += pcb->cbMaxLen;
// Finish setting up column binding struct
pFX->Default(lpszName,(void*)&value, AFX_RFX_DATE,
dwBindOptions);
return;
}
case CDaoFieldExchange::Fixup:
// Must reset the valid currency flag
if (pFX->m_prs->GetFieldLength(pFX->m_nField-1) == DAO_NULL)
value.SetStatus(COleDateTime::null);
else
value.SetStatus(COleDateTime::valid);
// Fall through to reset the NULL status
default:
pFX->Default(lpszName, (void*)&value, AFX_RFX_DATE,
dwBindOptions);
return;
#ifdef _DEBUG
case CDaoFieldExchange::DumpField:
*pFX->m_pdcDump << "\n" << lpszName << ":" << value;
return;
#endif //_DEBUG
}
}
//////////////////////////////////////////////////////////////////////////////
// DAO memory allocation callback helpers
STDAPI DaoStringAllocCallback(DWORD dwLen, DWORD pData, void** ppv)
{
LPTSTR lpsz;
CString* pstr = (CString*)pData;
#ifndef _UNICODE
// If using ANSI DAO interfaces, DAO reports field length
// rather than data length. In this case there will not be space
// for NULL terminator if data length equals field length. Make room.
dwLen++;
#endif
TRY
{
// Only re-allocate if necessary
lpsz = pstr->GetBufferSetLength(dwLen/sizeof(TCHAR));
*ppv = (void*)(dwLen > 0 ? lpsz : NULL);
}
CATCH_ALL(e)
{
e->Delete();
return E_OUTOFMEMORY;
}
END_CATCH_ALL
return S_OK;
}
STDAPI DaoBinaryAllocCallback(DWORD dwLen, DWORD pData, void** ppv)
{
CByteArray* pByteArray = (CByteArray*)pData;
TRY
{
// Only re-allocate if necessary
pByteArray->SetSize(dwLen);
*ppv = (void*)(dwLen > 0 ? &((*pByteArray)[0]) : NULL);
}
CATCH_ALL(e)
{
// Only exceptions thrown should be CMemoryException
e->Delete();
return E_OUTOFMEMORY;
}
END_CATCH_ALL
return S_OK;
}
STDAPI DaoLongBinaryAllocCallback(DWORD dwLen, DWORD pData, void** ppv)
{
CLongBinary* pLongBinary = (CLongBinary*)pData;
TRY
{
AllocLongBinary(*pLongBinary, dwLen);
}
CATCH_ALL(e)
{
// Only exception is memory exception, just pass back error.
DELETE_EXCEPTION(e);
return E_OUTOFMEMORY;
}
END_CATCH_ALL
if (pLongBinary->m_dwDataLength != 0)
{
const BYTE* pByte;
pByte = (const BYTE*)::GlobalLock(pLongBinary->m_hData);
// If mem can't be locked, free up and return error
if (pByte == NULL)
{
::GlobalFree(pLongBinary->m_hData);
pLongBinary->m_hData = NULL;
return E_OUTOFMEMORY;
}
*ppv = (void*)pByte;
}
else
*ppv = NULL;
return S_OK;
}
void AFX_CDECL AllocLongBinary(CLongBinary& lb, DWORD dwDataLength)
{
if (lb.m_hData == NULL)
{
if (dwDataLength > 0)
{
// Alloc memory, return error if not possible
lb.m_hData = ::GlobalAlloc(GMEM_MOVEABLE, dwDataLength);
if (lb.m_hData == NULL)
AfxThrowMemoryException();
}
}
else if (::GlobalSize(lb.m_hData) < dwDataLength)
{
// Save the old address in case ReAlloc fails
HGLOBAL hOldData = lb.m_hData;
// Alloc more mem, free up mem and throw exception if not possible
lb.m_hData = ::GlobalReAlloc(hOldData, dwDataLength, GMEM_MOVEABLE);
if (lb.m_hData == NULL)
{
lb.m_hData = hOldData;
AfxThrowMemoryException();
}
}
lb.m_dwDataLength = dwDataLength;
}
//////////////////////////////////////////////////////////////////////////////
// Inline function declarations expanded out-of-line
#ifndef _AFX_ENABLE_INLINES
static char _szAfxDaoInl[] = "afxdao.inl";
#undef THIS_FILE
#define THIS_FILE _szAfxDaoInl
#define _AFXDAODFX_INLINE
#include "afxdao.inl"
#endif
#ifdef AFX_INIT_SEG
#pragma code_seg(AFX_INIT_SEG)
#endif
/////////////////////////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -