Bla, da ich n abgang schieb, geb ich euch noch paar dinge, davon ist eins die DBInstance wo von mir überarbeitet worden ist, sollte euren DB Server noch etwas ankurbeln, sofern ihr wisst wie man es einsetzt. ;)
DBInstance.cpp:
DBInstance.h:
Wie gesagt, ihr müsst nur wissen wie ihr es einsetzt, ich werde es euch nicht verraten. :p
Credits: Crasy, Clemi.
Mfg.
DBInstance.cpp:
Code:
#include "StdAfx.h"
#include "DBInstance.h"
CDBInstance::CDBInstance()
{
m_hStmt = NULL;
m_hDbc = NULL;
m_hEnv = NULL;
for( byte i = 0; i < MAXCOL; i++ )
{
m_szCol[i] = new char[4192];
memset( m_szCol[i], 0, 4192);
}
}
CDBInstance::~CDBInstance()
{
Disconnect();
for( byte i = 0; i < MAXCOL; i++ )
delete [] ( m_szCol[i] );
}
void CDBInstance::Disconnect()
{
Clear();
SQLFreeHandle(SQL_HANDLE_STMT, m_hStmt );
SQLDisconnect( m_hDbc );
SQLFreeHandle(SQL_HANDLE_DBC, m_hDbc );
SQLFreeHandle(SQL_HANDLE_ENV, m_hEnv );
}
void CDBInstance::Clear()
{
SQLCloseCursor( m_hStmt );
SQLFreeStmt( m_hStmt, SQL_UNBIND );
}
bool CDBInstance::Connect( _In_ char* szDBName, _In_ char* szLogin, _In_ char* szDBPass )
{
SQLAllocHandle( SQL_HANDLE_ENV,SQL_NULL_HANDLE, &m_hEnv );
SQLSetEnvAttr( m_hEnv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3_80, SQL_IS_INTEGER );
SQLAllocHandle( SQL_HANDLE_DBC, m_hEnv, &m_hDbc );
SQLSetConnectAttr(m_hDbc, SQL_LOGIN_TIMEOUT, (SQLPOINTER)5, 0);
if(!SQL_SUCCEEDED( SQLConnect( m_hDbc, (SQLCHAR*)szDBName, SQL_NTS, (SQLCHAR*)szLogin, SQL_NTS, (SQLCHAR*)szDBPass, SQL_NTS ) ))
{
Error( "(ERROR) %s(%d): Can't connect to Database!! [%s]", __FUNCTION__, __LINE__, szDBName );
return false;
}
SQLAllocHandle( SQL_HANDLE_STMT, m_hDbc, &m_hStmt );
return true;
}
bool CDBInstance::BindParameter( _In_ SQLUSMALLINT parameterNumber, _In_ SQLSMALLINT inputOutputType, _In_ SQLSMALLINT valueType, _In_ SQLSMALLINT parameterType, _In_ SQLUINTEGER columnSize, _In_ SQLSMALLINT decimalDigits, _In_ SQLPOINTER parameterValuePtr, _In_ SQLINTEGER bufferLength, _In_ SQLINTEGER *strLen_or_IndPtr )
{
return SQL_SUCCEEDED( SQLBindParameter( m_hStmt, parameterNumber, inputOutputType, valueType, parameterType, columnSize, decimalDigits, parameterValuePtr, bufferLength, strLen_or_IndPtr ) );
}
void CDBInstance::PrepareFetch()
{
SQLNumResultCols( m_hStmt, &m_nCol );
SWORD nActualLen = NULL;
SWORD m_nSQLType = NULL;
UDWORD m_nPrecision = NULL;
SWORD m_nScale = NULL;
SWORD m_nNullability = NULL;
for( short i = 0; i < m_nCol; i++ )
{
if( !SQL_SUCCEEDED( SQLBindCol( m_hStmt, i+1, SQL_C_CHAR, m_szCol[i], 8192, &m_nColLength[i] ) ) )
Error( "(ERROR) %s(%d): Bin col failed. [%d]", __FUNCTION__, __LINE__, i );
if( !SQL_SUCCEEDED( SQLDescribeCol( m_hStmt, i+1, m_szColName[i], 16, &nActualLen, &m_nSQLType, &m_nPrecision, &m_nScale, &m_nNullability ) ) )
Error( "(ERROR) %s(%d): Bin describe failed. [%d]", __FUNCTION__, __LINE__, i );
}
}
void CDBInstance::Execute( _In_ char* szFormat, _In_ ... )
{
char szBuffer[1024] = { NULL };
va_list arg;
va_start( arg, szFormat );
int nLength = vsnprintf_s( szBuffer, 1024, szFormat, arg );
va_end(arg);
Clear();
if( !SQL_SUCCEEDED( SQLExecDirect( m_hStmt, (SQLCHAR*)szBuffer, nLength ) ) )
{
Error( "(ERROR) %s(%d): Query execute failed. [%d][ %s ]", __FUNCTION__, __LINE__, nLength, szBuffer );
return;
}
PrepareFetch();
}
short CDBInstance::FindCol( _In_ char* szName )
{
for( short i = NULL; i < m_nCol; i++ )
{
if ( strcmp( szName, (char*)m_szColName[i] ) == 0 )
return i + 1;
}
__debugbreak();
return -1;
}
Code:
#pragma once
#define MAXCOL 128
#include <sql.h>
#include <sqlext.h>
class CDBInstance
{
public:
CDBInstance();
virtual ~CDBInstance();
inline void Clear();
bool Connect( _In_ char* szDBName, _In_ char* szLogin, _In_ char* szDBPass );
void Disconnect();
void Execute( _In_ char* szFormat, _In_ ... );
bool BindParameter( _In_ SQLUSMALLINT parameterNumber, _In_ SQLSMALLINT inputOutputType, _In_ SQLSMALLINT valueType, _In_ SQLSMALLINT parameterType, _In_ SQLUINTEGER columnSize, _In_ SQLSMALLINT decimalDigits, _In_ SQLPOINTER parameterValuePtr, _In_ SQLINTEGER bufferLength, _In_ SQLINTEGER *strLen_or_IndPtr );
inline bool Fetch() { return SQL_SUCCEEDED( SQLFetch( m_hStmt ) ); }
private:
void PrepareFetch();
public:
inline byte GetByte( _In_ char* szColumn ) { return atoi( m_szCol[FindCol(szColumn)-1] ); }
inline double GetDouble( _In_ char* szColumn ) { return atof( m_szCol[FindCol(szColumn)-1] ); }
inline int GetInt( _In_ char* szColumn ) { return atoi( m_szCol[FindCol(szColumn)-1] ); }
inline __int64 GetInt64( _In_ char* szColumn ) { return _atoi64( m_szCol[FindCol(szColumn)-1] ); }
inline float GetFloat( _In_ char* szColumn ) { return (float)atof( m_szCol[FindCol(szColumn)-1] ); }
inline char GetChar( _In_ char* szColumn ) { return m_szCol[FindCol(szColumn)-1][0]; }
private:
SQLHENV m_hEnv;
SQLHDBC m_hDbc;
SQLHSTMT m_hStmt;
char* m_szCol[MAXCOL];
SQLCHAR m_szColName[MAXCOL][32];
SQLINTEGER m_nColLength[MAXCOL];
SQLSMALLINT m_nCol;
short FindCol( _In_ char* szName );
};
Credits: Crasy, Clemi.
Mfg.