Lightweight 0.20260617.0
Loading...
Searching...
No Matches
Lightweight::SqlStatement Class Referencefinal

High level API for (prepared) raw SQL statements. More...

#include <SqlStatement.hpp>

Inheritance diagram for Lightweight::SqlStatement:
Lightweight::SqlDataBinderCallback

Public Member Functions

LIGHTWEIGHT_API SqlStatement ()
 Construct a new SqlStatement object, using a new connection, and connect to the default database.
 
LIGHTWEIGHT_API SqlStatement (SqlStatement &&other) noexcept
 Move constructor.
 
LIGHTWEIGHT_API SqlStatementoperator= (SqlStatement &&other) noexcept
 Move assignment operator.
 
 SqlStatement (SqlStatement const &) noexcept=delete
 
SqlStatementoperator= (SqlStatement const &) noexcept=delete
 
LIGHTWEIGHT_API SqlStatement (SqlConnection &relatedConnection)
 Construct a new SqlStatement object, using the given connection.
 
LIGHTWEIGHT_API SqlStatement (std::nullopt_t)
 Construct a new empty SqlStatement object. No SqlConnection is associated with this statement.
 
LIGHTWEIGHT_API bool IsAlive () const noexcept
 Checks whether the statement's connection is alive and the statement handle is valid.
 
LIGHTWEIGHT_API bool IsPrepared () const noexcept
 Checks whether the statement has been prepared.
 
LIGHTWEIGHT_API SqlConnectionConnection () noexcept
 Retrieves the connection associated with this statement.
 
LIGHTWEIGHT_API SqlConnection const & Connection () const noexcept
 Retrieves the connection associated with this statement.
 
LIGHTWEIGHT_API SqlErrorInfo LastError () const
 Retrieves the last error information with respect to this SQL statement handle.
 
LIGHTWEIGHT_API SqlQueryBuilder Query (std::string_view const &table={}) const
 Creates a new query builder for the given table, compatible with the SQL server being connected.
 
LIGHTWEIGHT_API SqlQueryBuilder QueryAs (std::string_view const &table, std::string_view const &tableAlias) const
 Creates a new query builder for the given table with an alias, compatible with the SQL server being connected.
 
LIGHTWEIGHT_API SQLHSTMT NativeHandle () const noexcept
 Retrieves the native handle of the statement.
 
LIGHTWEIGHT_API void Prepare (std::string_view query) &
 
LIGHTWEIGHT_API SqlStatement Prepare (std::string_view query) &&
 Prepares the statement for execution on an rvalue reference and returns the statement.
 
void Prepare (SqlQueryObject auto const &queryObject) &
 
SqlStatement Prepare (SqlQueryObject auto const &queryObject) &&
 Prepares the statement from a query object on an rvalue reference and returns the statement.
 
std::string const & PreparedQuery () const noexcept
 Retrieves the last prepared query string.
 
template<SqlInputParameterBinder Arg>
void BindInputParameter (SQLSMALLINT columnIndex, Arg const &arg)
 Binds an input parameter to the prepared statement at the given column index.
 
template<SqlInputParameterBinder Arg, typename ColumnName >
void BindInputParameter (SQLSMALLINT columnIndex, Arg const &arg, ColumnName &&columnNameHint)
 Binds an input parameter to the prepared statement at the given column index with a column name hint.
 
template<SqlInputParameterBinder... Args>
SqlResultCursor Execute (Args const &... args)
 Binds the given arguments to the prepared statement and executes it.
 
LIGHTWEIGHT_API SqlResultCursor ExecuteWithVariants (std::vector< SqlVariant > const &args)
 Binds the given arguments to the prepared statement and executes it.
 
template<SqlInputParameterBatchBinder FirstColumnBatch, std::ranges::contiguous_range... MoreColumnBatches>
SqlResultCursor ExecuteBatchNative (FirstColumnBatch const &firstColumnBatch, MoreColumnBatches const &... moreColumnBatches)
 
template<SqlInputParameterBatchBinder FirstColumnBatch, std::ranges::range... MoreColumnBatches>
SqlResultCursor ExecuteBatchSoft (FirstColumnBatch const &firstColumnBatch, MoreColumnBatches const &... moreColumnBatches)
 
template<SqlInputParameterBatchBinder FirstColumnBatch, std::ranges::range... MoreColumnBatches>
SqlResultCursor ExecuteBatch (FirstColumnBatch const &firstColumnBatch, MoreColumnBatches const &... moreColumnBatches)
 
LIGHTWEIGHT_API SqlResultCursor ExecuteBatch (std::span< SqlRawColumn const > columns, size_t rowCount)
 
template<std::ranges::contiguous_range Rows, typename... ColumnAccessors>
requires (sizeof...(ColumnAccessors) >= 1 && (std::invocable<ColumnAccessors const&, std::ranges::range_value_t<Rows> const&> && ...))
SqlResultCursor ExecuteBatch (Rows const &rows, ColumnAccessors const &... accessors)
 
LIGHTWEIGHT_API SqlResultCursor ExecuteDirect (std::string_view const &query, std::source_location location=std::source_location::current())
 Executes the given query directly.
 
SqlResultCursor ExecuteDirect (SqlQueryObject auto const &query, std::source_location location=std::source_location::current())
 Executes the given query directly.
 
LIGHTWEIGHT_API RowArrayCursor ExecuteBatchFetch (std::string_view query, std::size_t arrayDepth)
 
template<typename Callable >
requires std::invocable<Callable, SqlMigrationQueryBuilder&>
void MigrateDirect (Callable const &callable, std::source_location location=std::source_location::current())
 Executes an SQL migration query, as created b the callback.
 
template<typename T >
requires (!std::same_as<T, SqlVariant>)
std::optional< T > ExecuteDirectScalar (std::string_view const &query, std::source_location location=std::source_location::current())
 
template<typename T >
requires (std::same_as<T, SqlVariant>)
ExecuteDirectScalar (std::string_view const &query, std::source_location location=std::source_location::current())
 Executes the given query and returns the single result as an SqlVariant.
 
template<typename T >
requires (!std::same_as<T, SqlVariant>)
std::optional< T > ExecuteDirectScalar (SqlQueryObject auto const &query, std::source_location location=std::source_location::current())
 
template<typename T >
requires (std::same_as<T, SqlVariant>)
ExecuteDirectScalar (SqlQueryObject auto const &query, std::source_location location=std::source_location::current())
 Executes the given query object and returns the single result as an SqlVariant.
 
LIGHTWEIGHT_API size_t LastInsertId (std::string_view tableName)
 Retrieves the last insert ID of the given table.
 
template<SqlOutputColumnBinder... Args>
LIGHTWEIGHT_FORCE_INLINE void BindOutputColumns (Args *... args)
 Out-of-line definition of SqlStatement::BindOutputColumns.
 
template<SqlOutputColumnBinder T>
LIGHTWEIGHT_FORCE_INLINE void BindOutputColumn (SQLUSMALLINT columnIndex, T *arg)
 Out-of-line definition of SqlStatement::BindOutputColumn.
 
template<SqlInputParameterBinder Arg>
LIGHTWEIGHT_FORCE_INLINE void BindInputParameter (SQLSMALLINT columnIndex, Arg const &arg)
 Binds an input parameter to the prepared statement at the given column index.
 
template<SqlInputParameterBinder Arg, typename ColumnName >
LIGHTWEIGHT_FORCE_INLINE void BindInputParameter (SQLSMALLINT columnIndex, Arg const &arg, ColumnName &&columnNameHint)
 Binds an input parameter to the prepared statement at the given column index with a column name hint.
 
template<SqlInputParameterBatchBinder FirstColumnBatch, std::ranges::range... MoreColumnBatches>
LIGHTWEIGHT_FORCE_INLINE SqlResultCursor ExecuteBatch (FirstColumnBatch const &firstColumnBatch, MoreColumnBatches const &... moreColumnBatches)
 
- Public Member Functions inherited from Lightweight::SqlDataBinderCallback
 SqlDataBinderCallback ()=default
 Default constructor.
 
 SqlDataBinderCallback (SqlDataBinderCallback &&)=default
 Default move constructor.
 
 SqlDataBinderCallback (SqlDataBinderCallback const &)=default
 Default copy constructor.
 
SqlDataBinderCallbackoperator= (SqlDataBinderCallback &&)=default
 Default move assignment operator.
 
SqlDataBinderCallbackoperator= (SqlDataBinderCallback const &)=default
 Default copy assignment operator.
 

Detailed Description

High level API for (prepared) raw SQL statements.

SQL prepared statement lifecycle:

  1. Prepare the statement
  2. Optionally bind output columns to local variables
  3. Execute the statement (optionally with input parameters)
  4. Fetch rows (if any)
  5. Repeat steps 3 and 4 as needed

Definition at line 67 of file SqlStatement.hpp.

Member Function Documentation

◆ IsAlive()

LIGHTWEIGHT_FORCE_INLINE bool Lightweight::SqlStatement::IsAlive ( ) const
inlinenoexcept

Checks whether the statement's connection is alive and the statement handle is valid.

Definition at line 994 of file SqlStatement.hpp.

References Lightweight::SqlConnection::IsAlive().

◆ IsPrepared()

LIGHTWEIGHT_FORCE_INLINE bool Lightweight::SqlStatement::IsPrepared ( ) const
inlinenoexcept

Checks whether the statement has been prepared.

Definition at line 999 of file SqlStatement.hpp.

◆ Connection() [1/2]

LIGHTWEIGHT_FORCE_INLINE SqlConnection & Lightweight::SqlStatement::Connection ( )
inlinenoexcept

Retrieves the connection associated with this statement.

Definition at line 1004 of file SqlStatement.hpp.

Referenced by Lightweight::DataMapper::Query(), Lightweight::DataMapper::Query(), Lightweight::DataMapper::Query(), and Lightweight::DataMapper::QuerySingle().

◆ Connection() [2/2]

LIGHTWEIGHT_FORCE_INLINE SqlConnection const & Lightweight::SqlStatement::Connection ( ) const
inlinenoexcept

Retrieves the connection associated with this statement.

Definition at line 1009 of file SqlStatement.hpp.

◆ LastError()

LIGHTWEIGHT_FORCE_INLINE SqlErrorInfo Lightweight::SqlStatement::LastError ( ) const
inline

Retrieves the last error information with respect to this SQL statement handle.

Definition at line 1014 of file SqlStatement.hpp.

◆ NativeHandle()

LIGHTWEIGHT_FORCE_INLINE SQLHSTMT Lightweight::SqlStatement::NativeHandle ( ) const
inlinenoexcept

Retrieves the native handle of the statement.

Definition at line 1019 of file SqlStatement.hpp.

◆ Prepare() [1/3]

LIGHTWEIGHT_API void Lightweight::SqlStatement::Prepare ( std::string_view  query) &

◆ Prepare() [2/3]

LIGHTWEIGHT_FORCE_INLINE void Lightweight::SqlStatement::Prepare ( SqlQueryObject auto const &  queryObject) &
inline

Prepares the statement for execution.

Note
When preparing a new SQL statement the previously executed statement, yielding a result set, must have been closed.

Definition at line 1024 of file SqlStatement.hpp.

◆ Prepare() [3/3]

LIGHTWEIGHT_FORCE_INLINE SqlStatement Lightweight::SqlStatement::Prepare ( SqlQueryObject auto const &  queryObject) &&
inline

Prepares the statement from a query object on an rvalue reference and returns the statement.

Definition at line 1029 of file SqlStatement.hpp.

◆ PreparedQuery()

LIGHTWEIGHT_FORCE_INLINE std::string const & Lightweight::SqlStatement::PreparedQuery ( ) const
inlinenoexcept

Retrieves the last prepared query string.

Definition at line 1034 of file SqlStatement.hpp.

◆ Execute()

template<SqlInputParameterBinder... Args>
SqlResultCursor Lightweight::SqlStatement::Execute ( Args const &...  args)

◆ ExecuteBatchNative()

template<SqlInputParameterBatchBinder FirstColumnBatch, std::ranges::contiguous_range... MoreColumnBatches>
SqlResultCursor Lightweight::SqlStatement::ExecuteBatchNative ( FirstColumnBatch const &  firstColumnBatch,
MoreColumnBatches const &...  moreColumnBatches 
)

Executes the prepared statement on a batch of data.

Each parameter represents a column, to be bound as input parameter. The element types of each column container must be explicitly supported.

In order to support column value types, their underlying storage must be contiguous. Also the input range itself must be contiguous. If any of these conditions are not met, the function will not compile - use ExecuteBatch() instead.

Definition at line 1229 of file SqlStatement.hpp.

◆ ExecuteBatchSoft()

template<SqlInputParameterBatchBinder FirstColumnBatch, std::ranges::range... MoreColumnBatches>
SqlResultCursor Lightweight::SqlStatement::ExecuteBatchSoft ( FirstColumnBatch const &  firstColumnBatch,
MoreColumnBatches const &...  moreColumnBatches 
)

Executes the prepared statement on a batch of data.

Each parameter represents a column, to be bound as input parameter, and the number of elements in these bound column containers will mandate how many executions will happen.

This function will bind and execute each row separately, which is less efficient than ExecuteBatchNative(), but works non-contiguous input ranges.

Definition at line 1281 of file SqlStatement.hpp.

◆ ExecuteBatch() [1/4]

template<SqlInputParameterBatchBinder FirstColumnBatch, std::ranges::range... MoreColumnBatches>
SqlResultCursor Lightweight::SqlStatement::ExecuteBatch ( FirstColumnBatch const &  firstColumnBatch,
MoreColumnBatches const &...  moreColumnBatches 
)

Executes the prepared statement on a batch of data.

Each parameter represents a column, to be bound as input parameter, and the number of elements in these bound column containers will mandate how many executions will happen.

Referenced by Lightweight::DataMapper::CreateAll(), and Lightweight::DataMapper::UpdateAll().

◆ ExecuteBatch() [2/4]

LIGHTWEIGHT_API SqlResultCursor Lightweight::SqlStatement::ExecuteBatch ( std::span< SqlRawColumn const >  columns,
size_t  rowCount 
)

Executes the prepared statement on a batch of SqlRawColumn-prepared data.

Parameters
columnsThe columns to bind as input parameters.
rowCountThe number of rows to execute.

◆ ExecuteBatch() [3/4]

template<std::ranges::contiguous_range Rows, typename... ColumnAccessors>
requires (sizeof...(ColumnAccessors) >= 1 && (std::invocable<ColumnAccessors const&, std::ranges::range_value_t<Rows> const&> && ...))
SqlResultCursor Lightweight::SqlStatement::ExecuteBatch ( Rows const &  rows,
ColumnAccessors const &...  accessors 
)

Executes the prepared statement once per row of a row-major batch, preferring native ODBC row-wise array binding (a single zero-copy SQLExecute) and transparently falling back to a prepare-once + per-row execute when native binding is not possible.

Unlike the column-major ExecuteBatch overloads, the data here is laid out as an array of row structs (e.g. records). Each accessors invocable maps a row to one bound column's value, returning a reference into the row (so the native path binds the value in place):

stmt.ExecuteBatch(std::span { records }, [](Record const& r) -> auto const& { return r.id.Value(); }, ...);

The native row-wise path is taken when every column value type is row-bindable (SqlNativeRowBindableValue, or std::optional of such a non-numeric type), every accessor returns an lvalue reference, the row stride satisfies the indicator-alignment requirement, and the driver advertises parameter-array support (SqlConnection::SupportsNativeRowBatch). A per-row runtime stride check guards against accessors that are not constant-offset subobjects. Otherwise the soft path is used, which correctly binds every supported type (strings, binary, variant, std::optional of any type, …) one row at a time.

Parameters
rowsContiguous range of row structs (e.g. std::span<Record const>).
accessorsOne invocable per bound column; accessor(row) yields that column's value.
Returns
A result cursor for the executed batch (empty when rows is empty).

Definition at line 1315 of file SqlStatement.hpp.

◆ ExecuteDirect()

LIGHTWEIGHT_FORCE_INLINE SqlResultCursor Lightweight::SqlStatement::ExecuteDirect ( SqlQueryObject auto const &  query,
std::source_location  location = std::source_location::current() 
)
inline

Executes the given query directly.

Definition at line 1971 of file SqlStatement.hpp.

◆ ExecuteBatchFetch()

LIGHTWEIGHT_API RowArrayCursor Lightweight::SqlStatement::ExecuteBatchFetch ( std::string_view  query,
std::size_t  arrayDepth 
)

Executes query and prepares bulk row-array fetching with up to arrayDepth rows per SQLFetchScroll round-trip.

This is a fast-path alternative to the per-cell SQLGetData loop used by the regular result cursor: it binds one contiguous buffer per result column and materializes whole row blocks per ODBC round-trip. Only fixed-stride column types are supported (integers, floating point, and bounded character columns). LOB / unbounded columns (varchar(max)/text/varbinary(max)) are rejected by the returned cursor's construction.

Parameters
queryThe SQL query to execute.
arrayDepthMaximum number of rows materialized per SQLFetchScroll call (must be > 0).
Returns
A RowArrayCursor bound to this statement's result set.

◆ MigrateDirect()

template<typename Callable >
requires std::invocable<Callable, SqlMigrationQueryBuilder&>
void Lightweight::SqlStatement::MigrateDirect ( Callable const &  callable,
std::source_location  location = std::source_location::current() 
)

Executes an SQL migration query, as created b the callback.

Definition at line 1979 of file SqlStatement.hpp.

◆ ExecuteDirectScalar() [1/4]

template<typename T >
requires (!std::same_as<T, SqlVariant>)
std::optional< T > Lightweight::SqlStatement::ExecuteDirectScalar ( std::string_view const &  query,
std::source_location  location = std::source_location::current() 
)
inline

Executes the given query, assuming that only one result row and column is affected, that one will be returned.

Definition at line 1994 of file SqlStatement.hpp.

Referenced by Lightweight::DataMapper::Execute().

◆ ExecuteDirectScalar() [2/4]

template<typename T >
requires (std::same_as<T, SqlVariant>)
T Lightweight::SqlStatement::ExecuteDirectScalar ( std::string_view const &  query,
std::source_location  location = std::source_location::current() 
)
inline

Executes the given query and returns the single result as an SqlVariant.

Definition at line 2003 of file SqlStatement.hpp.

References Lightweight::SqlNullValue.

◆ ExecuteDirectScalar() [3/4]

template<typename T >
requires (!std::same_as<T, SqlVariant>)
std::optional< T > Lightweight::SqlStatement::ExecuteDirectScalar ( SqlQueryObject auto const &  query,
std::source_location  location = std::source_location::current() 
)
inline

Executes the given query, assuming that only one result row and column is affected, that one will be returned.

Definition at line 2014 of file SqlStatement.hpp.

◆ ExecuteDirectScalar() [4/4]

template<typename T >
requires (std::same_as<T, SqlVariant>)
T Lightweight::SqlStatement::ExecuteDirectScalar ( SqlQueryObject auto const &  query,
std::source_location  location = std::source_location::current() 
)
inline

Executes the given query object and returns the single result as an SqlVariant.

Definition at line 2021 of file SqlStatement.hpp.

◆ BindOutputColumns()

template<SqlOutputColumnBinder... Args>
LIGHTWEIGHT_FORCE_INLINE void Lightweight::SqlStatement::BindOutputColumns ( Args *...  args)
inline

Out-of-line definition of SqlStatement::BindOutputColumns.

Definition at line 1041 of file SqlStatement.hpp.

◆ BindOutputColumn()

template<SqlOutputColumnBinder T>
LIGHTWEIGHT_FORCE_INLINE void Lightweight::SqlStatement::BindOutputColumn ( SQLUSMALLINT  columnIndex,
T *  arg 
)
inline

Out-of-line definition of SqlStatement::BindOutputColumn.

Definition at line 1091 of file SqlStatement.hpp.

◆ BindInputParameter() [1/2]

template<SqlInputParameterBinder Arg>
LIGHTWEIGHT_FORCE_INLINE void Lightweight::SqlStatement::BindInputParameter ( SQLSMALLINT  columnIndex,
Arg const &  arg 
)
inline

Binds an input parameter to the prepared statement at the given column index.

Definition at line 1108 of file SqlStatement.hpp.

◆ BindInputParameter() [2/2]

template<SqlInputParameterBinder Arg, typename ColumnName >
LIGHTWEIGHT_FORCE_INLINE void Lightweight::SqlStatement::BindInputParameter ( SQLSMALLINT  columnIndex,
Arg const &  arg,
ColumnName &&  columnNameHint 
)
inline

Binds an input parameter to the prepared statement at the given column index with a column name hint.

Definition at line 1117 of file SqlStatement.hpp.

◆ ExecuteBatch() [4/4]

template<SqlInputParameterBatchBinder FirstColumnBatch, std::ranges::range... MoreColumnBatches>
LIGHTWEIGHT_FORCE_INLINE SqlResultCursor Lightweight::SqlStatement::ExecuteBatch ( FirstColumnBatch const &  firstColumnBatch,
MoreColumnBatches const &...  moreColumnBatches 
)
inline

Executes the prepared statement on a batch of data.

Each parameter represents a column, to be bound as input parameter, and the number of elements in these bound column containers will mandate how many executions will happen.

Definition at line 1269 of file SqlStatement.hpp.


The documentation for this class was generated from the following file: