}
retcode = SQLBindParameter(hstmt1, 2, SQL_PARAM_INPUT, SQL_C_CHAR,SQL_VARCHAR, 20, 0, szInput, 20, &cb2);
if ( (retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO) ) {
ProcessLogMessages(SQL_HANDLE_STMT, hstmt1,\
}
for(int i=0;i<20;i++) {//循环插入
iInput = i;
sprintf((char*)szInput,\ retcode = SQLExecute(hstmt1); if ( (retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO) ) {
ProcessLogMessages(SQL_HANDLE_STMT, hstmt1,\ }
SQLRowCount(hstmt1,&iRowCount); printf(\= %d\\n\ }
SQLFreeHandle(SQL_HANDLE_STMT,hstmt1); }
2.5.6 通过列绑定获取字段数据
在从结果集中读取字段值时可以利用SQLGetData,但为了速度可以利用列绑定的方式,在每次移动光标后让ODBC将数据传送到指定的变量中。 SQLRETURN SQLBindCol(
SQLHSTMT StatementHandle, SQLUSMALLINT ColumnNumber, SQLSMALLINT TargetType, SQLPOINTER TargetValuePtr, SQLINTEGER BufferLength, SQLLEN * StrLen_or_Ind); StatementHandle:STMT句柄。
ColumnNumber:列的位置,从1开始计算。
ValueType:指明用于和参数绑定的C语言数据类型。 ParameterType:指明在存储过程中ODBC数据类型。
BufferLength:指明参数指针所指向的缓冲区的字节数大小。对于字符串和结构需要指明大小,而对于普通的变量如SQLINTEGER,SQLFLOAT等设置为0就可以了。 StrLen_or_IndPtr:返回拷贝的缓冲区的数据的字节数。
void OnTestP8() {
SQLCHAR szOutput[20];
SQLINTEGER iOutput=0;
SQLCHAR szSQL[100]=\test_insert\
SQLINTEGER cb1=0,cb2=SQL_NTS;
retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc1, &hstmt1);
retcode = SQLExecDirect(hstmt1,szSQL, SQL_NTS); if ( (retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO) ) {
ProcessLogMessages(SQL_HANDLE_STMT, hstmt1,\ }
retcode = SQLBindCol(hstmt1, 1, SQL_C_LONG,&iOutput, 0, &cb1);
if ( (retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO) ) {
ProcessLogMessages(SQL_HANDLE_STMT, hstmt1,\ }
retcode = SQLBindCol(hstmt1, 2, SQL_C_CHAR,szOutput, 20, &cb2);
if ( (retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO) ) {
ProcessLogMessages(SQL_HANDLE_STMT, hstmt1,\ }
while ( (retcode = SQLFetch(hstmt1) ) != SQL_NO_DATA ) {
// SQLGetData(hstmt1, 1, SQL_C_LONG, &iOutput, 0, &cb1);
// SQLGetData(hstmt1, 2, SQL_C_CHAR, szOutput, 20, &cb2);
printf(\szOutput);
}
SQLFreeHandle(SQL_HANDLE_STMT,hstmt1); }
2.5.7 ODBC中BLOB(Binary Large Object)字段数据的处理
2.5.7.1 BLOB字段数据的查询
前面提到过的API 函数 SQLGetData可以用于得到普通的字段,也可以得到类似于TEXT,IMAGE等大数据量的字段。如果字段的长度大于缓冲区的长度,那么需要多次调用SQLGetData 来获取字段所有的数据。在获得最后一次数据后SQLGetData会返回
SQL_NO_DATA 。SQLGetData的最后一个参数会返回剩余的数据的长度,记住这个长度是指在调用SQLGetData 之前剩余数据的长度而不是调用之后。 假设你的测试数据如下:
create table test_blob (user_id int identity(1,1),user_memo text not null) insert into test_blob values
('abcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcd
efgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcd
efgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcd
efgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefg')
现在我们用一个长度为150的缓冲区来分多次得到字段 user_memo的实际内容。这里我们使用了SQLServer中的一个函数DATALENGTH,这个函数的作用是得到字段的字节长度,用于和你实际得到的数据长度来进行比较。 void DoSelectBlob(void) {
#define BUFFER_LENGTH 150 //定义数据区的长度
RETCODE retcode;
SQLCHAR bBinaryPtr[BUFFER_LENGTH]; //保存user_memo TEXT类型字段的值
SQLINTEGER iUserID,iDataLen; //保存user_id INTEGER字段的值 SQLINTEGER cb1, cb2 ,cb3; //保存数据长度
SQLCHAR szSQL[] = \test_blob\
//SQL语句中选出的第二个字段是在SQLServer中计算数据长度的函数,用于得到user_memo字段的数据长度 //删除了分配句柄的代码
retcode = SQLExecDirect(hstmt1,szSQL,SQL_NTS);
retcode = SQLBindCol(hstmt1, 1, SQL_C_ULONG, &iUserID, 0, &cb1); retcode = SQLBindCol(hstmt1, 2, SQL_C_ULONG, &iDataLen, 0, &cb2); //通过列绑定来获得第一和第二个字段的值