eagle518 发表于 2007-11-10 23:49

cli SQLPutData() 返回不应出现的22001错!郁闷。

客户端:IBM INFORMIX-Client SDK 3.00.UC2
系统环境: linux 2.6.9-34.EL #1

服务端
INFORMIX-OnLine Version 7.22.UC2


SQLParamData()后调用SQLPutData() 总是返回
"ERROR: -11023:22001 : String data right truncation."

可实际长度肯定没有超长。

是SQLParamData()只支持INFORMIX 7。31以上版本吗?还是cli存在一个bug?

盼高手前来分析解答!

以下是部分相关代码:


                            params.eDataType = stdtype;
                            params.value = value;
                            params.size = size;
                            params.written = 0;
                            params.field_max_size = maxsize;
                           
                            rc = SQLBindParameter(m_hstmt, (SQLUSMALLINT)(j+1),
                                                SQL_PARAM_INPUT,
                                                SQL_C_CHAR,
                                                paramType,
                                                0, //FIELD_MAX_SIZE,   // ColumnSize
                                                0,                  // DecimalDigits
                                                &params,         // ParameterValuePtr - context
                                                0,                  // Buffer length
                                                &StrLen_or_IndPtr);//StrLen_or_IndPtr
                            if (CheckError(rc, SQL_HANDLE_STMT, m_hstmt)) {
                                    APPEND_SQLRET_ERRMSG;
                              //
                              bSqlRet = FALSE;
                              break;
                                }
                    }
                    if (!bSqlRet) {
                            ez_pfree(&params);
                            break;
                    }
                   
                    //execute
                        rc = SQLExecDirect(m_hstmt, (SQLCHAR*)pSql, SQL_NTS);
                        if (rc != SQL_NEED_DATA) {
                                CheckError(rc, SQL_HANDLE_STMT, m_hstmt);
                            ez_pfree(&params);
                            APPEND_SQLRET_ERRMSG;
                      //
                      bSqlRet = FALSE;
                      break;
                        }
                    else {
                            SQLPOINTER ValuePtr;
                            SQLRETURNretcode;
                           
                            while((rc = SQLParamData(m_hstmt, &ValuePtr)) == SQL_NEED_DATA) {
                                        Param *pParam = (Param *)ValuePtr;
                                        ez_uint32_t nActualWrite;
                                        void *pBuf;
                                       
                                        while(1) {
                                                if (pParam->size - pParam->written > 0) {
                                                        nActualWrite = (pParam->size - pParam->written > 4096) ?
                                                                       4096 : pParam->size - pParam->written;
                                                        printf("value=[%s],len=%d\n", (char *)pParam->value + pParam->written, nActualWrite);
                                                        void *pp = (void *)((char *)pParam->value + pParam->written);
                                                        printf("pp=%s\n", pp);
                                                        retcode = SQLPutData(m_hstmt,
                                                                             pp,
                                                                             nActualWrite);
                                                        if (CheckError(retcode, SQL_HANDLE_STMT, m_hstmt)) {
                                                            ez_pfree(&params);
                                                            APPEND_SQLRET_ERRMSG;
                                                      //
                                                      bSqlRet = FALSE;
                                                      break;
                                                        }
                                                        printf("pParam->written=%d\n", pParam->written);
                                                        pParam->written += nActualWrite;
                                                        continue;
                                                }
                                                else
                                                        break;
                                        }
                                        if (!bSqlRet) {
                                            ez_pfree(&params);
                                            break;
                                    }
                                    printf("rc0000=%d\n", rc);
                                }
                                printf("--------------0\n");
                                if (rc != SQL_NO_DATA) {
                                        printf("rc=%d\n", rc);
                                        if (CheckError(rc, SQL_HANDLE_STMT, m_hstmt)) {
                                            ez_pfree(&params);
                                            APPEND_SQLRET_ERRMSG;
                                      //
                                      bSqlRet = FALSE;
                                      break;
                                        }
                                }
                            printf("--------------1\n");
                            APPEND_SQLRET_SUCCESS;
                    }
页: [1]
查看完整版本: cli SQLPutData() 返回不应出现的22001错!郁闷。