📄 dbcursor.cpp
字号:
// DBCursor.cpp: implementation of the CDBCursor class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "DBCursor.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CDBCursor::CDBCursor()
{
m_cursorDBProc = NULL;
m_KeysetCols = 0;
m_KeysetRows = 0;
m_dbCursor = NULL;
m_pStatus = 0;
m_ppResultCharData = 0;
m_ppResultCharLength = 0;
m_fetchCount = 0;
}
CDBCursor::CDBCursor(PDBPROCESS dbproc):m_cursorDBProc(dbproc)
{
m_dbCursor = NULL;
m_KeysetCols = 0;
m_KeysetRows = 0;
m_pStatus = 0;
m_ppResultCharData = 0;
m_ppResultCharLength = 0;
m_fetchCount = 0;
}
CDBCursor::~CDBCursor()
{
if(m_dbCursor != NULL)
CloseDBCursor();
ReleaseBuffer();
}
////////////////////////////////////////////////////////////
//the implement of this class
PDBCURSOR CDBCursor::OpenDBCursor(LPCSTR strSQL, int scrollopt,
int concuropt, int nrows )
{//返回当前打开的游标值
if(m_cursorDBProc == NULL)
return NULL;
m_pStatus = new DBINT[nrows];
m_cursorRows = nrows;//每次取出的记录数
PDBCURSOR pCursor;
//to test the "select" privilege
dbfreebuf(m_cursorDBProc);
dbfcmd(m_cursorDBProc,strSQL);
int retcode = dbsqlexec(m_cursorDBProc);
if (dbresults (m_cursorDBProc) == SUCCEED)
{
while (dbnextrow (m_cursorDBProc) != NO_MORE_ROWS)
{
}
}
else
return 0;
pCursor = dbcursoropen ( m_cursorDBProc, (LPCSTR)strSQL,
scrollopt,concuropt,(UINT)nrows,m_pStatus );
m_dbCursor = pCursor;
//获取打开的数据库表中的记录数和列数,
//并把结果保存在相应的数据域中
GetCursorInfo();
return pCursor;
}
void CDBCursor::CloseDBCursor()
{
if(m_dbCursor != NULL)
{
dbcursorclose(m_dbCursor);
m_dbCursor = NULL;
}
ReleaseBuffer();
}
void CDBCursor::ReleaseBuffer()
{
delete []m_ppResultCharData;
m_ppResultCharData = 0;
delete []m_ppResultCharLength;
m_ppResultCharLength=0;
delete []m_pStatus;
m_pStatus = 0;
}
BOOL CDBCursor::GetCursorInfo()
{//得到游标的行和列的数目
int retcode = dbcursorinfo (m_dbCursor , &m_KeysetCols , &m_KeysetRows );
return retcode != 0;
}
BOOL CDBCursor::GetCursorColNameInfo(CStringList &colNameList)
{//得到结果集的列信息并写入m_colInfoList中
colNameList.RemoveAll();
char *col_name = new char[MAX_FIELD_NAME_LENGTH];
int retcode;
for (int i = 1 ; i<= m_KeysetCols ; i++)
{
retcode = dbcursorcolinfo(m_dbCursor,(int)i,col_name,NULL,NULL,NULL);
colNameList.AddTail(col_name);
}
delete col_name;
return retcode != 0;
}
BOOL CDBCursor::DBCursorBind()
{//绑定数据列
m_ppResultCharData = new char[ m_KeysetCols*MAX_FIELD_LENGTH*m_cursorRows];
memset(m_ppResultCharData , 0 ,sizeof(char)*m_KeysetCols*MAX_FIELD_LENGTH*m_cursorRows);
m_ppResultCharLength = new DBINT[m_KeysetCols*m_cursorRows];
memset(m_ppResultCharLength, 0 ,sizeof(DBINT)*m_KeysetCols*m_cursorRows);
int retcode = 0;
for (int i=1 ; i <= m_KeysetCols ; i++ )
{
retcode = dbcursorbind (m_dbCursor , i ,
NTBSTRINGBIND ,
(long)(MAX_FIELD_LENGTH),
m_ppResultCharLength+(m_cursorRows*(i-1)),
(BYTE *)&(m_ppResultCharData[(i-1) *m_cursorRows* MAX_FIELD_LENGTH]));
}
return (retcode != 0);
}
BOOL CDBCursor::DBCursorFetch(int fetchtype, int rownum )
{//fetchtype,rownum的取值及其含义请参考dbcursorfetch()函数的说明
int retcode = 0;
m_fetchCount ++;
retcode = dbcursorfetch ( m_dbCursor ,fetchtype,rownum );
return (retcode != FAIL);
}
CString CDBCursor::GetCellText(int row, int col)
{
CString CellText;
int k = row - (m_fetchCount-1)*m_cursorRows;
CellText = CString( &(m_ppResultCharData[
( col * m_cursorRows*MAX_FIELD_LENGTH) + ( k * MAX_FIELD_LENGTH)]));
return CellText;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -