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

📄 sh_database.cpp

📁 rsa算法打的一个包
💻 CPP
字号:
// SH_Database.cpp: implementation of the SH_Database class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "SH_Database.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

SH_Database::SH_Database()
{
	m_hEnv  = NULL;
	m_hConn = NULL;
	m_hStmt = NULL;
	
	m_nTimeout = 5;

	m_strDSN    = _T("");
	m_strUID    = _T("");
	m_strPWD    = _T("");
	m_strSQL    = _T("");
    m_strDriver = _T("");

}

SH_Database::~SH_Database()
{
    /*Database connection close*/
	Close();

    /*Memory clear*/
    Clear();
}

void SH_Database::Close()
{
	/*Close handle*/
	if(m_hStmt)
		SQLFreeHandle(SQL_HANDLE_STMT,m_hStmt);


	if(m_hConn)
	{
		SQLDisconnect(m_hConn);
		SQLFreeHandle(SQL_HANDLE_DBC,m_hConn);
	}
	if(m_hEnv)
		SQLFreeHandle(SQL_HANDLE_ENV,m_hEnv);

	m_hEnv  = NULL;
	m_hConn = NULL;
	m_hStmt = NULL;
}

BOOL SH_Database::Open(LPCTSTR szDatabase,LPCTSTR szUID,LPCTSTR szPWD,int nTimeout)
{
	SQLRETURN sr;

	SetDatabase(szDatabase);
	SetUID(szUID);
	SetPWD(szPWD);
    SetDSN(szDatabase);
	SetTimeout(nTimeout);

	sr = SQLAllocHandle(SQL_HANDLE_ENV,NULL,&m_hEnv);
	if(!SUCCEED(sr))
	{
		TRACE("Allocate ODBC Env failed\n");
		return FALSE;
	}
	sr = SQLSetEnvAttr(m_hEnv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0); 
	if(!SUCCEED(sr))
	{
		TRACE("Set ODBC Env attribute failed\n");
		SQLFreeHandle(SQL_HANDLE_ENV,m_hEnv);
		return FALSE;
	}
	sr = SQLAllocHandle(SQL_HANDLE_DBC,m_hEnv,&m_hConn);
	if(!SUCCEED(sr))
	{
		TRACE("Allocate ODBC DBC failed\n");
		SQLFreeHandle(SQL_HANDLE_ENV,m_hEnv);
		return FALSE;
	}

	SQLSetConnectAttr(m_hConn, (SQLINTEGER)SQL_LOGIN_TIMEOUT, (SQLPOINTER)m_nTimeout, 0);

	/* Connect to data source */
	sr = SQLConnect(m_hConn,
		                 (SQLCHAR*)GetDSN(), SQL_NTS,
						 (SQLCHAR*)GetUID(), SQL_NTS,
						 (SQLCHAR*)GetPWD(), SQL_NTS);
	 
	if (!SUCCEED(sr))
	{
		TRACE("ODBC connect failed\n");
		SQLFreeHandle(SQL_HANDLE_DBC,m_hConn);
		SQLFreeHandle(SQL_HANDLE_ENV,m_hEnv);
		return FALSE;
	}
    /* Allocate statement handle */
    sr = SQLAllocHandle(SQL_HANDLE_STMT, m_hConn, &m_hStmt); 
	if(!SUCCEED(sr))
	{
		TRACE("Allocate ODBC stmt failed\n");
		SQLFreeHandle(SQL_HANDLE_DBC,m_hConn);
		SQLDisconnect(m_hConn);
		SQLFreeHandle(SQL_HANDLE_ENV,m_hEnv);
		return FALSE;
	}

    if(!GetColumns())
        OutputDebugString("Error:Fail to retrieve database's information!\n");

    return TRUE;
}
BOOL SH_Database::OpenEx(LPCTSTR szDatabase,int nTimeout)
{
	SWORD nResult;
	SQLRETURN sr;
	UCHAR szConnOut[MAX_CONNECT_LEN];

	SetDatabase(szDatabase);
    SetDSN(szDatabase);
	SetTimeout(nTimeout);

	sr = SQLAllocHandle(SQL_HANDLE_ENV,NULL,&m_hEnv);
	if(!SUCCEED(sr))
	{
		TRACE("Allocate ODBC Env failed\n");
		return FALSE;
	}
	sr = SQLSetEnvAttr(m_hEnv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0); 
	if(!SUCCEED(sr))
	{
		TRACE("Set ODBC Env attribute failed\n");
		SQLFreeHandle(SQL_HANDLE_ENV,m_hEnv);
		return FALSE;
	}
	sr = SQLAllocHandle(SQL_HANDLE_DBC,m_hEnv,&m_hConn);
	if(!SUCCEED(sr))
	{
		TRACE("Allocate ODBC DBC failed\n");
		SQLFreeHandle(SQL_HANDLE_ENV,m_hEnv);
		return FALSE;
	}

	SQLSetConnectAttr(m_hConn, (SQLINTEGER)SQL_LOGIN_TIMEOUT, (SQLPOINTER)m_nTimeout, 0);

    /* Connect to data source */

    sr = SQLDriverConnect(m_hConn, 
                          NULL,
		                  (SQLCHAR*)GetDSN(), SQL_NTS,
		                  szConnOut, sizeof(szConnOut)-1,
		                  &nResult, SQL_DRIVER_NOPROMPT);
	 
	if (!SUCCEED(sr))
	{
		TRACE("ODBC connect failed\n");
		SQLFreeHandle(SQL_HANDLE_DBC,m_hConn);
		SQLFreeHandle(SQL_HANDLE_ENV,m_hEnv);
		return FALSE;
	}
    /* Allocate statement handle */
    sr = SQLAllocHandle(SQL_HANDLE_STMT, m_hConn, &m_hStmt); 
	if(!SUCCEED(sr))
	{
		TRACE("Allocate ODBC stmt failed\n");
		SQLFreeHandle(SQL_HANDLE_DBC,m_hConn);
		SQLDisconnect(m_hConn);
		SQLFreeHandle(SQL_HANDLE_ENV,m_hEnv);
		return FALSE;
	}
 
    if(!GetColumns())
        OutputDebugString("Error:Fail to retrieve database's information!\n");

	return TRUE;
}
BOOL SH_Database::SUCCEED(SQLRETURN sr)
{
    if(sr == SQL_SUCCESS || sr == SQL_SUCCESS_WITH_INFO)
        return TRUE;
    else
    {
        TRACE("SQL error.Error no is %d\n",sr);
        return FALSE;
    }
}

BOOL SH_Database::ExecuteSQL(LPCTSTR lpszSQL,int nStrLen)
{
	SQLRETURN sr = SQLExecDirect(m_hStmt,(SQLTCHAR*)lpszSQL,(SQLINTEGER)nStrLen);
	
	return SUCCEED(sr);
}

BOOL SH_Database::GetRowCount(int * pnCount)
{
	SQLRETURN sr = SQL_ERROR;

	sr = SQLRowCount(m_hStmt,(SQLINTEGER*)pnCount);

	return SUCCEED(sr);
}

BOOL SH_Database::Fetch()
{
	SQLRETURN sr = SQL_ERROR;
    char str[256] = {0};

    sprintf(str,"Executing fetch operation,HSTMT 's handle %08X\n",(DWORD)m_hStmt);
    OutputDebugString(str);
    
    sr = SQLFetch(m_hStmt);

	return SUCCEED(sr);
}

BOOL SH_Database::MoveFirst()
{
	SQLRETURN sr = SQL_ERROR;

	return SUCCEED(sr);

}

BOOL SH_Database::MoveLast()
{
	SQLRETURN sr = SQL_ERROR;

	return SUCCEED(sr);

}

BOOL SH_Database::MoveNext()
{
	SQLRETURN sr = SQL_ERROR;

	sr = SQLFetch(m_hStmt);

	return SUCCEED(sr);

}

BOOL SH_Database::MovePrev()
{
	SQLRETURN sr = SQL_ERROR;

	return SUCCEED(sr);
}

BOOL SH_Database::BindCol(int nIndex, int nType, void *pValue, int nLen)
{
	SQLRETURN sr = SQL_ERROR;
	SQLINTEGER cbLen;

	sr = SQLBindCol(m_hStmt,nIndex,nType,(SQLPOINTER)pValue,nLen,(SQLINTEGER*)&cbLen);

	return SUCCEED(sr);
}
BOOL SH_Database::BindCol(LPCTSTR szTable,LPCTSTR szField,int nType,void * pValue,int nLen)
{
	SQLRETURN sr = SQL_ERROR;
    SH_Field *  pField;

    pField = FindField(szTable,szField);

    if(pField)
    {
        sr = BindCol(pField->nPos,nType,pValue,nLen);
    }

	return SUCCEED(sr);
}
BOOL SH_Database::BindCol(LPCTSTR szTable,LPCTSTR szField,void * pValue,int nLen)
{
	SQLRETURN sr = SQL_ERROR;
    SH_Field *  pField;

    pField = FindField(szTable,szField);

    if(pField)
    {
        sr = BindCol(pField->nPos,pField->nType,pValue,nLen);
    }

	return SUCCEED(sr);
}

BOOL SH_Database::FetchBegin()
{
    /* Allocate statement handle */
	SQLRETURN sr = SQL_ERROR;
    sr = SQLAllocHandle(SQL_HANDLE_STMT, m_hConn, &m_hStmt); 
	return SUCCEED(sr);
}

BOOL SH_Database::FetchEnd()
{
	SQLRETURN sr = SQL_ERROR;
    sr = SQLFreeHandle(SQL_HANDLE_STMT,m_hStmt); 

//  sr = SQLFreeStmt(m_hStmt,SQL_UNBIND|SQL_CLOSE);
    m_hStmt = NULL;
	return SUCCEED(sr);
}
BOOL SH_Database::GetColumns()
{
    BOOL          bRet = FALSE;
    /* Declare buffers for result set data */
    SQLCHAR       szCatalog[129], szSchema[129];
    SQLCHAR       szTableName[129], szColumnName[129];
    SQLCHAR       szTypeName[129], szRemarks[255];
    SQLCHAR       szColumnDefault[129], szIsNullable[129];
    SQLINTEGER    ColumnSize, BufferLength, CharOctetLength, OrdinalPosition;
    SQLSMALLINT   DataType, DecimalDigits, NumPrecRadix, Nullable;
    SQLSMALLINT   SQLDataType, DatetimeSubtypeCode;
    SQLRETURN     sr;

    /* Declare buffers for bytes available to return */

    SQLINTEGER cbCatalog, cbSchema, cbTableName, cbColumnName;
    SQLINTEGER cbDataType, cbTypeName, cbColumnSize, cbBufferLength;
    SQLINTEGER cbDecimalDigits, cbNumPrecRadix, cbNullable, cbRemarks;
    SQLINTEGER cbColumnDefault, cbSQLDataType, cbDatetimeSubtypeCode, cbCharOctetLength;
    SQLINTEGER cbOrdinalPosition, cbIsNullable;

    SH_Table *     pTable;
    SH_Field *     pField;

    
    FetchBegin();
    
    sr = SQLColumns(m_hStmt,NULL, 0,NULL, 0,NULL, 0,NULL, 0);

    if (SUCCEED(sr)) 
    {

       /* Bind columns in result set to buffers */
       SQLBindCol(m_hStmt, 1, SQL_C_CHAR, szCatalog, 129,&cbCatalog);
       SQLBindCol(m_hStmt, 2, SQL_C_CHAR, szSchema, 129, &cbSchema);
       SQLBindCol(m_hStmt, 3, SQL_C_CHAR, szTableName, 129,&cbTableName);
       SQLBindCol(m_hStmt, 4, SQL_C_CHAR, szColumnName, 129, &cbColumnName);
       SQLBindCol(m_hStmt, 5, SQL_C_SSHORT, &DataType, 0, &cbDataType);
       SQLBindCol(m_hStmt, 6, SQL_C_CHAR, szTypeName, 129, &cbTypeName);
       SQLBindCol(m_hStmt, 7, SQL_C_SLONG, &ColumnSize, 0, &cbColumnSize);
       SQLBindCol(m_hStmt, 8, SQL_C_SLONG, &BufferLength, 0, &cbBufferLength);
       SQLBindCol(m_hStmt, 9, SQL_C_SSHORT, &DecimalDigits, 0, &cbDecimalDigits);
       SQLBindCol(m_hStmt, 10, SQL_C_SSHORT, &NumPrecRadix, 0, &cbNumPrecRadix);
       SQLBindCol(m_hStmt, 11, SQL_C_SSHORT, &Nullable, 0, &cbNullable);
       SQLBindCol(m_hStmt, 12, SQL_C_CHAR, szRemarks, 255, &cbRemarks);
       SQLBindCol(m_hStmt, 13, SQL_C_CHAR, szColumnDefault, 129, &cbColumnDefault);
       SQLBindCol(m_hStmt, 14, SQL_C_SSHORT, &SQLDataType, 0, &cbSQLDataType);
       SQLBindCol(m_hStmt, 15, SQL_C_SSHORT, &DatetimeSubtypeCode, 0,&cbDatetimeSubtypeCode);
       SQLBindCol(m_hStmt, 16, SQL_C_SLONG, &CharOctetLength, 0, &cbCharOctetLength);
       SQLBindCol(m_hStmt, 17, SQL_C_SLONG, &OrdinalPosition, 0, &cbOrdinalPosition);
       SQLBindCol(m_hStmt, 18, SQL_C_CHAR, szIsNullable, 129, &cbIsNullable);

       while(Fetch()) 
       {
           bRet = TRUE;
           
           if(IsSystemTable((LPCTSTR)szTableName)) continue;

           pTable = AppendTable((LPCTSTR)szTableName);

           pField = AppendField(pTable,(LPCTSTR)szColumnName);
           pField->nLen  = ColumnSize;
           pField->nPos  = OrdinalPosition;
           pField->nType = SQLDataType;

/*
           TRACE("Table:%s,Field:%s,TypeName:%s,DataType:%d,SQLType:%d,Position:%d,ColumnSize:%d\n",
               szTableName,szColumnName,szTypeName,DataType,SQLDataType,OrdinalPosition,ColumnSize);
*/
       }
    }

    FetchEnd();
    return bRet;
}

SH_Database::SH_Table *  SH_Database::AppendTable(LPCTSTR lpszTable)
{
    SH_Table *   pTable;

    pTable = FindTable(lpszTable);
    if(pTable == NULL)
    {
        pTable = new SH_Table;

        strcpy(pTable->szName,lpszTable);

        m_TableList.AddTail(pTable);
    }
    return pTable;
}

SH_Database::SH_Field *  SH_Database::AppendField(SH_Table *  pTable, LPCTSTR lpszField)
{
    SH_Field *   pField;

    VERIFY(pTable != NULL);

    pField = FindField(pTable,lpszField);
    
    if(pField == NULL)
    {
        pField = new SH_Field;
        VERIFY(pField!=NULL);

        strcpy(pField->szName,lpszField);
        pField->pUserData = NULL;

        pTable->m_FieldList.AddTail(pField);
    }

    return pField;
}

SH_Database::SH_Table *  SH_Database::FindTable(LPCTSTR lpszTable)
{
    SH_Position  pos;
    SH_Table *   pTable;

    pos = m_TableList.GetHeadPosition();

    while(pos)
    {
        pTable = m_TableList.GetNext(pos);

        if(strcmp(pTable->szName,lpszTable) == 0)
            return pTable;
    }
    return NULL;
}

SH_Database::SH_Field *  SH_Database::FindField(SH_Table *  pTable, LPCTSTR lpszField)
{
    SH_Position pos;
    SH_Field *   pField;

    VERIFY(pTable != NULL);

    pos = pTable->m_FieldList.GetHeadPosition();

    while(pos)
    {
        pField = pTable->m_FieldList.GetNext(pos);

        if(pField)
        {
            if(strcmp(pField->szName,lpszField) == 0)
                return pField;
        }
    }
    return NULL;
}

SH_Database::SH_Field *  SH_Database::FindField(LPCTSTR lpszTable, LPCTSTR lpszField)
{
    SH_Table *  pTable = NULL;
    SH_Field *  pField = NULL;

    pTable = FindTable(lpszTable);

    if(pTable)
    {
        pField = FindField(pTable,lpszField);
    }
    return pField;
}

void SH_Database::Clear()
{
    SH_Position       pos;
    SH_Table *  pTable;

    /*Clear field list*/
    pos = m_TableList.GetHeadPosition();

    while(pos)
    {
        pTable = m_TableList.GetNext(pos);

        if(pTable)
        {
            while(!pTable->m_FieldList.IsEmpty())
            {
                delete (SH_Field * )pTable->m_FieldList.RemoveHead();
            }
        }
    }

    /*Clear table list*/
    while(!m_TableList.IsEmpty())
    {
        delete (SH_Table * )m_TableList.RemoveHead();
    }
}



BOOL SH_Database::Execute(LPCTSTR lpszSQL, int nLen)
{
	SQLRETURN sr;

    FetchBegin();
    sr = SQLExecDirect(m_hStmt,(SQLTCHAR*)lpszSQL,(SQLINTEGER)nLen);
    FetchEnd();
    
    return SUCCEED(sr);
}

BOOL SH_Database::Execute(SH_String strSQL)
{
	return Execute((LPCTSTR)strSQL,strSQL.GetLength());
}

⌨️ 快捷键说明

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