?? recordset.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 + -