24 #ifndef Safir_Databases_Statement_h
25 #define Safir_Databases_Statement_h
27 #ifndef SAFIR_NO_DEPRECATED
30 #include "Safir/Databases/Odbc/Internal/InternalDefs.h"
31 #include "Safir/Databases/Odbc/Internal/Parameter.h"
32 #include "Safir/Databases/Odbc/Internal/Column.h"
33 #include "Safir/Databases/Odbc/Internal/BufferedWideStringParameter.h"
34 #include "Safir/Databases/Odbc/Internal/NonBufferedWideStringParameter.h"
35 #include "Safir/Databases/Odbc/Internal/BufferedBinaryParameter.h"
36 #include "Safir/Databases/Odbc/Internal/NonBufferedBinaryParameter.h"
37 #include "Safir/Databases/Odbc/Internal/BinaryColumn.h"
38 #include "Safir/Databases/Odbc/Internal/WideStringColumn.h"
40 #include <boost/noncopyable.hpp>
53 #pragma warning(disable: 4275)
64 class OLIB_API
Statement :
private boost::noncopyable
121 void Prepare(
const std::wstring & wszSqlCommand);
132 void ExecDirect(
const std::wstring & wszSqlCommand);
164 int GetNumberOfColumns()
const;
174 void SetStmtAttr(
long lAttribute,
long lValue);
184 void SetStmtAttr(
long lAttribute,
const std::wstring & wszValue);
194 void GetStmtAttr(
long lAttribute,
long & lValue)
const;
205 void GetStmtAttr(
long lAttribute,
wchar_t * wszValue,
unsigned long ulLength)
const;
216 bool ParamData(
unsigned short & lParameter)
const;
229 template<
short sCType,
short sSqlType,
class Type,
short sInputOutputType,
unsigned long lColumnSize>
230 void BindParameter(
unsigned short usParameterNumber,
231 Internal::Parameter<sCType, sSqlType, Type, sInputOutputType,lColumnSize> & param );
232 template<
short sSqlType,
short sInputOutputType>
233 void BindParameter(
unsigned short usParameterNumber,
234 Internal::NonBufferedWideStringParameter<sSqlType, sInputOutputType> & param );
248 template<
short sCType,
short sSqlType,
class Type,
short sInputOutputType,
unsigned long lColumnSize>
249 void BindLongParameter(
unsigned short usParameterNumber,
250 Internal::Parameter<sCType, sSqlType, Type, sInputOutputType,lColumnSize> & param );
262 template<
short sValueType,
class Type>
263 void BindColumn(
unsigned short usColumnNumber,
264 Internal::Column<sValueType, Type> & column );
276 template<
short sValueType,
class Type>
277 bool GetData(
unsigned short usColumnNumber,
278 Internal::Column<sValueType, Type> & column );
288 template<
short sCType,
short sSqlType,
class Type,
short sInputOutputType,
unsigned long lColumnSize>
289 void PutData(Internal::Parameter<sCType, sSqlType, Type, sInputOutputType,lColumnSize> & param );
301 bool GetDiagRec(
short sRecNumber,
302 std::wstring & SqlState,
303 boost::int32_t & NativeError,
304 std::wstring & MessageText,
305 bool & bDataRead)
const;
311 bool IsValid()
const;
317 SQLHDBC Handle()
const;
319 SQLHSTMT m_hStatement;
323 void ThrowException(
const std::wstring & fileName,
325 SQLRETURN original_returncode)
const;
326 void ThrowException(SQLSMALLINT HandleType,
328 const std::wstring & fileName,
330 SQLRETURN original_returncode)
const;
348 return m_hStatement != SQL_NULL_HSTMT;
352 void Statement::SetNotValid()
354 m_hStatement = SQL_NULL_HSTMT;
357 template<
short sValueType,
class Type>
359 Internal::Column<sValueType, Type> & column )
362 bool bDataFound =
true;
367 ret = ::SQLGetData( m_hStatement,
369 column.m_csValueType,
370 column.GetValuePtr(),
372 column.GetLengthOrIndPtr());
373 if (ret==SQL_NO_DATA_FOUND)
375 else if (!SQL_SUCCEEDED(ret))
383 template<
short sValueType,
class Type>
385 Internal::Column<sValueType, Type> & column )
392 ret = ::SQLBindCol( m_hStatement,
394 column.m_csValueType,
395 column.GetValuePtr(),
397 column.GetLengthOrIndPtr());
398 if (!SQL_SUCCEEDED(ret))
404 template<
short sCType,
short sSqlType,
class Type,
short sInputOutputType,
unsigned long lColumnSize>
406 Internal::Parameter<sCType, sSqlType, Type, sInputOutputType,lColumnSize> & param )
413 ret = ::SQLBindParameter( m_hStatement,
415 param.m_csInputOutputType,
418 param.GetColumnSize(),
422 param.GetLengthOrIndPtr() );
423 if (!SQL_SUCCEEDED(ret))
429 template<
short sSqlType,
short sInputOutputType>
431 Internal::NonBufferedWideStringParameter<sSqlType, sInputOutputType> & )
437 template<
short sCType,
short sSqlType,
class Type,
short sInputOutputType,
unsigned long lColumnSize>
439 Internal::Parameter<sCType, sSqlType, Type, sInputOutputType,lColumnSize> & param )
446 ret = ::SQLBindParameter( m_hStatement,
448 param.m_csInputOutputType,
451 param.GetColumnSize(),
453 reinterpret_cast<SQLPOINTER
>(usParameterNumber),
455 param.GetLengthOrIndPtr() );
456 if (!SQL_SUCCEEDED(ret))
462 template<
short sCType,
short sSqlType,
class Type,
short sInputOutputType,
unsigned long lColumnSize>
463 void Statement::PutData(Internal::Parameter<sCType, sSqlType, Type, sInputOutputType,lColumnSize> & param )
470 ret = ::SQLPutData( m_hStatement,
474 if (!SQL_SUCCEEDED(ret))
487 #endif // Safir_Databases_Statement_h
DotsC_Int64 Int64
64 bit integer type.
Definition: Defs.h:69
Meant to be used when something goes very wrong.
Definition: Exceptions.h:360
#define __WFILE__
Definition: Exceptions.h:31
This namespace contains all the functionality and definitions of the SAFIR SDK.
Definition: Backdoor.h:30
void BindParameter(unsigned short usParameterNumber, Internal::Parameter< sCType, sSqlType, Type, sInputOutputType, lColumnSize > ¶m)
Binds a parameter to a statement.
Definition: Statement.h:405
SQLHDBC Handle() const
Returns the ODBC Handle of the statement.
Definition: Statement.h:340
void PutData(Internal::Parameter< sCType, sSqlType, Type, sInputOutputType, lColumnSize > ¶m)
Put data into a parameter.
Definition: Statement.h:463
The Connection class models a connection made to the database engine.
Definition: Connection.h:64
void BindLongParameter(unsigned short usParameterNumber, Internal::Parameter< sCType, sSqlType, Type, sInputOutputType, lColumnSize > ¶m)
Binds a long parameter to a statement.
Definition: Statement.h:438
bool IsValid() const
Checks if this statement is a valid allocated statement.
Definition: Statement.h:346
bool GetData(unsigned short usColumnNumber, Internal::Column< sValueType, Type > &column)
Get data from a column.
Definition: Statement.h:358
The Statement class models a statement made to the database engine and one statement object should be...
Definition: Statement.h:64
void BindColumn(unsigned short usColumnNumber, Internal::Column< sValueType, Type > &column)
Binds a column to a statement.
Definition: Statement.h:384