ODBC API开发教程 - 图文(10)

2019-09-01 12:04

}

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); //通过列绑定来获得第一和第二个字段的值


ODBC API开发教程 - 图文(10).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:第三章 平面机构的运动分析 习题与答案

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: