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); //本次传送数据完成
}
}