访问www.tomcoding.com网站,学习Oracle内部数据结构,详细文档说明,下载Oracle的exp/imp,DUL,logminer,ASM工具的源代码,学习高技术含量的内容。
遇到有LONG数据类型的表,要插入一条数据量很大的行,一次插入的缓冲区会不够大,这时需要一部分一部分的插入LONG数据,这就用到了在执行语句时动态提供数据的机制。在ODBC中要动态提供数据需要几个步骤。
1. 在绑定输入参数时,要在SQLBindParameter()函数中指定数据长度时,使用SQL_LEN_DATA_AT_EXEC()宏得到数据长度,告诉应用程序数据在执行语句时才提供,使用的数据类型要用SQL_LONGVARCHAR或SQL_LONGBINARY。同时数据指针要提供一个数值,标记这个字段,为了区分多个动态插入的字段,这个数值在后面调用SQLParamData()函数时会返回,这样应用程序就知道现在是哪个字段需要提供数据。
2. 执行SQLExecute()或SQLExecDirect()函数,因为语句中有动态字段,所以函数会返回SQL_NEED_DATA的返回值。
3. 调用SQLParamData()函数,返回标识字段的数值,这时就知道是为哪个字段插入数据。函数返回SQL_NEED_DATA,这时需要提供数据。
4. 循环调用SQLPutData()函数,为字段提供动态数据,直到插入的数据完毕。
5. 再次调用SQLParamData()函数,看看是否还有下一个动态插入的字段需要操作,函数返回SQL_NEED_DATA,说明需要为新字段提供数据,重复步骤4的操作。如果返回SQL_SUCCESS,说明没有要提供数据的字段了,把上一个动态插入数据的系列操作结束。
举一个例子,在test_long1表中插入LONG数据,字段叫summary,插入10000个字符。SQLBindParameter()函数的StrLen_or_IndPtr参数设置为SQL_LEN_DATA_AT_EXEC(10000),ParameterType设置为SQL_LONGVARCHAR,ParameterValuePtr设置为参数的编号,比如编号为3,那么函数设置如下。
len_ind3 = SQL_LEN_DATA_AT_EXEC(10000);
SQLBindParameter(stmth, 3, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, 10000, 0, (void *)3, 0, &len_ind3);
下面我们看一个实际的例子,在test_long1表中插入一条数据,绑定三个参数,后面两个参数都使用动态提供数据,主要看看SQLParamData()函数和SQLPutData()函数的用法,以及如何动态提供数据。代码如下。
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "sql.h"
#include "sqlext.h"
#include "sqltypes.h"
SQLHANDLE envh; /* env handle */
SQLHANDLE

最低0.47元/天 解锁文章
584

被折叠的 条评论
为什么被折叠?



