anc
anc

Reputation: 116

SQLExecute always returning "[Microsoft][SQL Server Native Client 10.0]String data, right truncation" in parameters more than 8k sized

When I execute the SQLExecute function it always returns me "[Microsoft][SQL Server Native Client 10.0]String data, right truncation" when my parameter has more than 8k bytes. I will paste the code below. What I'm trying to do: to store a XML file in a column declared as varbinary(max) through a Stored Procedure via ODBC drivers (Visual C++ 2008) in a SQL Server 2008 R2. The SP converts from varchar to varbinary calling SET @XML_FILE_BIN = CONVERT(VARBINARY(MAX), @XML_FILE) It works fine if I try it pasting the whole XML int the SQL Server Management Studio. I think something is wrong the binding in SQLBindParameter. The code:

char* cXmlBuf; it contains my buffer
retcode = SQLBindParameter(
    hstmt,              //StatementHandle
    1,                  //ParameterNumber
    SQL_PARAM_INPUT,    //InputOutputType
    SQL_C_CHAR,         //ValueType
    SQL_CHAR,           //ParameterType
    SQL_DESC_LENGTH,    //ColumnSize
    0,                  //DecimalDigits
    cXmlBuf,            //ParameterValuePtr
    bufLenght,          //BufferLength
    &cbXml              //StrLen_or_IndPtr
);

if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO)
    return;

SWORD id = 0;
SQLINTEGER cbId = 0;
retcode = SQLBindParameter(hstmt, 2, SQL_PARAM_OUTPUT, SQL_C_SSHORT, SQL_INTEGER, 0, 0, &id, 0, &cbId);

if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO)
    return;

retcode = SQLPrepare(hstmt, (SQLCHAR*)"{CALL MY_STORE_PROC(?, ?)}", SQL_NTS);

if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO)
    return;

retcode = SQLFreeStmt(hstmt, SQL_CLOSE); // Clear any cursor state
retcode = SQLExecute(hstmt);
//in this part retcode is -1 and "[Microsoft][SQL Server Native Client     
//10.0]String data, right truncation" is returned if my XML buffer
//has more than 8k

Upvotes: 0

Views: 289

Answers (1)

anc
anc

Reputation: 116

Found it! I've declared SQLINTEGER cbXml = SQL_NTS; instead SQLLEN cbXml = 0; Thanks.

Upvotes: 0

Related Questions