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

📄 recordset.cpp

📁 比较简陋的数据库应用,唯一能看的就是对ODBC的封装...
💻 CPP
字号:
#include "Recordset.h"

Recordset::Recordset(Database *pDB)
{
	m_pDB = pDB;
	m_ParamNum = 0;
	m_stmt = NULL;
	isOpen = false;
	m_RowTotal = 0;
	m_Where = m_Order = '\0';
//	m_Param = NULL;
}

Recordset::~Recordset()
{
	Close();
//	delete [] m_Param;
//	if (m_ParamNum != 1)
//	delete [] m_Param;
//	m_Param = NULL;
//	for (int i = 0; i < m_ParamNum; i++)
//		delete m_Param[i];
}

bool Recordset::Open(String strSQL)
{
	SQLRETURN ret;
	if (m_pDB == NULL || !m_pDB->IsOpen() || (ret = SQLAllocHandle(SQL_HANDLE_STMT, m_pDB->m_hdbc, &m_stmt)) != SQL_SUCCESS)
		return false;
	isOpen = true;
	SQLSetStmtAttr(m_stmt, SQL_ATTR_CURSOR_TYPE, (SQLPOINTER)SQL_SCROLLABLE, NULL);
	m_Buffer = strSQL;
	if (m_Where.getlenth() != 0)
		m_Buffer += " where " + m_Where;
	if (m_Order.getlenth() != 0)
		m_Buffer += " order by " + m_Order;
	for (int i = 0; i < m_ParamNum; i++)
		SQLBindCol(m_stmt, i + 1, SQL_CHAR, m_Param[i], (SQLINTEGER)45, NULL);
	if ((ret = SQLExecDirect(m_stmt, m_Buffer, SQL_NTS)) != SQL_SUCCESS)
	{
		SQLFreeHandle(SQL_HANDLE_STMT, m_stmt);
		isOpen = false;
	}
	if (isOpen)
	{
		while ((ret = SQLFetch(m_stmt)) == SQL_SUCCESS)
			m_RowTotal++;
		SQLFetchScroll(m_stmt, SQL_FETCH_FIRST, SQL_FETCH_ABSOLUTE);
	}
	return isOpen;
}

bool Recordset::Open()
{
	SQLRETURN ret;
	if (!m_pDB->IsOpen() || isOpen || (ret = SQLAllocHandle(SQL_HANDLE_STMT, m_pDB->m_hdbc, &m_stmt)) != SQL_SUCCESS)
		return false;
	isOpen = true;
	return true;
}

void Recordset::Close()
{
	if (isOpen)
	{
		SQLFreeHandle(SQL_HANDLE_STMT, m_stmt);
		isOpen = false;
	}
	m_Table = '\0';
	m_Where = '\0';
	m_Order = '\0';
	delete [] m_Param;
}

bool Recordset::IsOpen()
{
	return isOpen;
}

//SQLSetPos暂不能用,原因不明,寻求其他出路...
//本来想用SQLBindParameter,但无奈String类中str会变的,无法充当缓冲区
bool Recordset::Add()
{
	int i;
	SQLRETURN ret;
	m_Buffer = "insert into " + m_Table + " values(";
	for (i = 0; i < m_ParamNum - 1; i++)
		m_Buffer += "'" + m_Param[i] + "',";
	m_Buffer += "'" + m_Param[i] + "')";
	if ((ret = SQLExecDirect(m_stmt, m_Buffer, SQL_NTS)) != SQL_SUCCESS)
		return false;
	return true;
}

bool Recordset::Delete()
{
	SQLRETURN ret;
	m_Buffer = "delete from " + m_Table;
	if (m_Where.getlenth() != 0)
		m_Buffer += " where " + m_Where;
	if ((ret = SQLExecDirect(m_stmt, m_Buffer, SQL_NTS)) != SQL_SUCCESS)
		return false;
	return true;
}

bool Recordset::Edit()
{
	SQLRETURN ret;
	int i;
	m_Buffer = "update " + m_Table + " set ";
	for (i = 0; i < m_ParamNum / 2 - 1; i += 2)
		m_Buffer += m_Param[i] + "='" + m_Param[i + 1] + "',";
	m_Buffer += m_Param[i] + "='" + m_Param[i + 1] + "'";
	if (m_Where.getlenth() != 0)
		m_Buffer += " where " + m_Where;
	if ((ret = SQLExecDirect(m_stmt, m_Buffer, SQL_NTS)) != SQL_SUCCESS)
		return false;
	return true;
}

/*
bool Recordset::Update()
{
	SQLRETURN ret;
	if ((ret = SQLExecute(m_stmt)) != SQL_SUCCESS)
		return false;
	return true;
}
*/

//SQLSetPos会用就好了.......上面下面都好做......
bool Recordset::Move(int RowNum)
{
	if (RowNum > 0 && RowNum <= m_RowTotal)
	{
		//SQLSetPos(m_stmt, RowNum, SQL_POSITION, SQL_LOCK_NO_CHANGE);
		SQLFetchScroll(m_stmt, SQL_FETCH_FIRST, SQL_FETCH_ABSOLUTE);
		for (int i = 1; i < RowNum; i++)
			SQLFetch(m_stmt);
		return true;
	}
	return false;
}
bool Recordset::MoveNext()
{
	SQLRETURN ret;
	if ((ret = SQLFetch(m_stmt)) != SQL_SUCCESS)
		return false;
	return true;
}

bool Recordset::MovePrev()
{
	SQLRETURN ret;
	if ((ret = SQLFetchScroll(m_stmt, SQL_FETCH_PRIOR, SQL_FETCH_RELATIVE)) != SQL_SUCCESS)
		return false;
	return true;
}

void Recordset::SetParamNum(int num)
{
	m_ParamNum = num;
	delete [] m_Param;
	m_Param = new String[m_ParamNum];
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -