[odb-users] Quering with empty string parameter error. Microsoft SQL Server

Andrey Paraskevopulo andrey.psv at gmail.com
Fri Jun 28 10:12:09 EDT 2019

Unable to use empty string query parameters for the VARCHAR(MAX) fields.

db.query(odb::query<Data>::name == "/*or std::string()*/);
result: exception: COUNT field incorrect or syntax error

- mssql
- odb 2.4
- field type is VARCHAR(MAX)
- query condition (not persist parameter)

As I understand, the problem that param in statement exists("... WHERE
name=?"), but the value in not binded.

Possible solutions:

1. Init buffer data for the empty string with empty size (for the query
file: query.cxx
    void long_query_param_impl::
    copy ()
        if (chunk != chunk_null)
          if (buf_.capacity () < size_ + n)
            buf_.capacity (size_ + n, size_);

          memcpy (buf_.data () + size_, buf, n);
          size_ += n;
        if (chunk != chunk_null)
          if (n == 0)
            if (buf_.capacity() == 0 && buf != nullptr)
               assert(size_ == 0);
               buf_.capacity(size_ + 1, size_);
            if (buf_.capacity() < size_ + n)
               buf_.capacity(size_ + n, size_);

            memcpy(buf_.data() + size_, buf, n);
            size_ += n;

Remark: solution does not affect Blob variables (they have the null buf for
the empty values). May be the query problem can be reproduced for the Blobs

2. Disable skip empty binds (with null buffer)

file: statement.cxx
    void statement::
    bind_param (bind* b, size_t n)
      SQLRETURN r;

      SQLUSMALLINT i (0);
      for (bind* end (b + n); b != end; ++b)
->//        if (b->buffer == 0) // Skip NULL entries.
->//          continue;

This solves the problem, but for me it hard to predict side effects.
In the same time, it seems that in pgsql null entries are not skipped in
the bind_param function.

Andrey Paraskevopulo

More information about the odb-users mailing list