Lightweight 0.20250904.0
Loading...
Searching...
No Matches
SqlNullValue.hpp
1// SPDX-License-Identifier: Apache-2.0
2
3#pragma once
4
5#include "Core.hpp"
6
7namespace Lightweight
8{
9
10/// Helper binder type to indicate NULL values in SQL queries.
11///
12/// @ingroup DataTypes
14{
15 SQLLEN sqlValue = SQL_NULL_DATA;
16};
17
18/// Used to indicate a NULL value in a SQL query.
19///
20/// @ingroup DataTypes
21constexpr auto SqlNullValue = SqlNullType {};
22
23template <>
24struct SqlDataBinder<SqlNullType>
25{
26 static LIGHTWEIGHT_FORCE_INLINE SQLRETURN InputParameter(SQLHSTMT stmt,
27 SQLUSMALLINT column,
28 SqlNullType const& value,
29 SqlDataBinderCallback& cb) noexcept
30 {
31 // This is generally ignored for NULL values, but MS SQL Server requires a non-zero value
32 // when the underlying type is e.g. an INT.
33
34 // For MS SQL Server, we need to determine the actual SQL type of the column to bind the parameter correctly,
35 // because requires a correctly convertible SQL type for NULL values.
36 // e.g. MS SQL Server cannot convert a VARCHAR NULL to a binary column type (e.g. BLOB).
37 SQLSMALLINT const sqlType = [stmt, column, serverType = cb.ServerType()]() -> SQLSMALLINT {
38 if (serverType == SqlServerType::MICROSOFT_SQL)
39 {
40 SQLSMALLINT columnType {};
41 auto const sqlReturn = SQLDescribeParam(stmt, column, &columnType, nullptr, nullptr, nullptr);
42 if (SQL_SUCCEEDED(sqlReturn))
43 return columnType;
44 }
45 return SQL_C_CHAR;
46 }();
47
48 return SQLBindParameter(stmt,
49 column,
50 SQL_PARAM_INPUT,
51 SQL_C_CHAR,
52 sqlType,
53 10,
54 0,
55 nullptr,
56 0,
57 &const_cast<SqlNullType&>(value).sqlValue);
58 }
59
60 static LIGHTWEIGHT_FORCE_INLINE std::string_view Inspect(SqlNullType const& /*value*/) noexcept
61 {
62 return "NULL";
63 }
64};
65
66} // namespace Lightweight
constexpr auto SqlNullValue