ODBC C/C++开发注意点

ODBC 连接注意点
不要用基于数据源的连接字符串,因为这样就多了用鼠标配置数据源的步骤
应该用rc = SQLDriverConnect(m_conn, 0, (SQLCHAR*)connStr, strlen(connStr)
    , conn_str_out, sizeof(conn_str_out), &cbConnStrOut
    , SQL_DRIVER_NOPROMPT);
                这个函数


在读取blob字段的时候要注意
        SQLINTEGER dataLength = 0;
  unsigned char *buff = (unsigned char*)malloc(m_sz1, 0);
  int offset = 0;
  SQLRETURN rc;
  // When there is no more data to return, SQLGetData returns SQL_NO_DATA
  while (SQL_SUCCESS_WITH_INFO == (rc = SQLGetData(stmt_h,1, SQL_C_BINARY, buff+offset,ourSize, &dataLength)))
  {
   offset = m_sz1;
   m_sz1 *= 2;
   //malloc
  }
这里的返回值是SQL_SUCCESS_WITH_INFO,dataLength的返回值有点复杂,他是在查询数据前需要的长度,如果我们预先提供的ourSize长度足够则不用考虑这个值;
如果这个值比我们预先提供的值大,则下一次需要的长度是dataLength-ourSize,很多文档没有写清楚这个

insert blob字段比较简单,网上很多文章说是要先分配一个长度,如果不够则继续分配长度,其实这种说法是不对的,只需一次分配长度就行了。正确的insert blob是:

void insertBlob(unsigned char *sql,SQLHSTMT hstmt1,unsigned char *blobPtr,int blobLen)
{
 RETCODE retcode;
 SQLPOINTER   pToken;
 SQLINTEGER   cb1;
 retcode = SQLPrepare(hstmt1,sql, SQL_NTS);
 cb1 = SQL_LEN_DATA_AT_EXEC(blobLen);//用户提供的数据长度
    retcode = SQLBindParameter(hstmt1, 1, SQL_PARAM_INPUT, SQL_C_BINARY, SQL_LONGVARBINARY, blobLen, 0, (SQLPOINTER)3, 0, &cb1);
 retcode = SQLExecute(hstmt1);
 retcode = SQLParamData(hstmt1, &pToken);
 if(retcode == SQL_NEED_DATA)  
 {
  retcode = SQLPutData(hstmt1, blobPtr,blobLen);
  retcode = SQLParamData(hstmt1, &pToken); //本次传送数据完成
 }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值