2016-07-15 1 views
0

Когда я выполняю функцию SQLExecute, она всегда возвращает мне «[Microsoft] [Собственный клиент SQL Server 10.0] Строковые данные, правильное усечение ", когда мой параметр имеет более 8 Кбайт. Я вставлю код ниже. Что я пытаюсь сделать: сохранить XML-файл в столбце, объявленном как varbinary (max), через Хранимую процедуру через драйверы ODBC (Visual C++ 2008) в SQL Server 2008 R2. SP преобразует из varchar в вызов varbinary SET @XML_FILE_BIN = CONVERT(VARBINARY(MAX), @XML_FILE) Он отлично работает, если я пытаюсь вставить весь XML в SQL Server Management Studio. Я думаю, что что-то не так связано с SQLBindParameter. Код:SQLExecute всегда возвращает «[Microsoft] [Собственный клиент SQL Server 10.0] Строковые данные, правильное усечение» в параметрах размером более 8k

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 

ответ

0

Найденный! Я объявил SQLINTEGER cbXml = SQL_NTS; вместо SQLLEN cbXml = 0; Спасибо.

Смежные вопросы