⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dbcursor.cpp

📁 在VC中用DB-Library快速访问SQL Server数据库技术
💻 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 + -