Menu

#142 Cant bind int64_t with odbc_backend

cppdb-0.3.x
open
nobody
1
2015-12-04
2015-12-04
Anonymous
No

In file odbc_backend.cpp in class odbc_backend::statement::parameter in template method

template <typename T>     /* line 591*/
void set(T v)
{
    std::ostringstream ss;
    ss.imbue(std::locale::classic());
    if(!std::numeric_limits<T>::is_integer)
        ss << std::setprecision(std::numeric_limits<T>::digits10+1);
    ss << v;

    value=ss.str();
    null=false;
    ctype = SQL_C_CHAR;
    if(std::numeric_limits<T>::is_integer) 
        sqltype = SQL_INTEGER;
    else
        sqltype = SQL_DOUBLE;
}

This code cant handle integer values larger than 0x80000000, since they need a SQL_BIGINT sqltype, but SQL_INTEGER passed.

Passing value larger that that, causes an ODBC numeric type out of range error. At least with SQL Server 2012 on Windows 7 client and server. Library and client application compiled with msvc2013 c++ compiller.

Proposed patch in attachment.

For any feedback, please email on vasilly.prokopyev<at>gmail.com

1 Attachments

Discussion

Anonymous
Anonymous

Add attachments
Cancel