应用程序管理的数据缓冲¶
当通过参数化语句中的setxxx方法为绑定参数提供数据时,这些值被复制到内部数据缓冲区中,然后将复制的值提供给数据库服务器以供插入。为了减少复制用户缓冲区中可用的字符串类型数据的开销,可以使用ResultSet类的setDataBuffer()和next()方法以及Statement类的execute()方法。
使用setDataBuffer()方法¶
为了对于高性能应用程序,ACCI提供了setDataBuffer方法,应用程序据此管理数据缓冲区。下面的例子展示了setDataBuffer()方法:
void setDataBuffer(int paramIndex,
void *buffer,
Type type,
sb4 size,
ub2 *length,
sb2 *ind = NULL,
ub2 *rc = NULL);
在前面的方法示例中使用了以下参数:
- paramIndex:参数数量
- buffer:包含数据的数据缓冲区
- type:数据缓冲区中数据的类型
- size:数据缓冲区的大小
- length:数据缓冲区中数据的当前长度
- ind:指标信息。这表示数据是否为空。对于参数化语句,-1的值意味着要插入空值。对于从可调用语句返回的数据,值为-1表示检索空数据。
- rc:返回代码。此变量不适用于提供给语句方法的数据。但是,对于从可调用语句返回的数据,返回代码指定了特定于参数的错误号。
并不是所有的数据类型都可以通过setDataBuffer()方法提供和检索。例如,c++标准库字符串不能通过setDataBuffer()接口提供。
setxxx()方法提供的数据和setDataBuffer()方法提供的数据之间有一个重要的区别。在setxxx()方法中复制数据时,一旦复制了数据,原始数据就可以更改。例如,您可以使用setString(str1)方法,然后在执行之前更改str1的值。使用的str1的值是setString(str1)被调用时的值。但是,对于setDataBuffer()方法提供的数据,缓冲区必须保持有效,直到执行完成。
如果使用executeArrayUpdate()方法,那么可以在单个缓冲区中提供多行数据。
这个接口也适用于数组执行和具有数组或OUT绑定参数的可调用语句。
在ResultSet类中也可以使用相同的方法来检索数据,而无需为每次获取重新分配缓冲区。
使用executeArrayUpdate()方法¶
如果所有数据都是通过setDataBuffer()方法提供的(也就是说,除了setDataBuffer()或getStream()之外,没有setxxx()方法被调用),那么就有了一种简单的迭代执行方法。
在这种情况下,你应该使用适当大小的数组为每个参数调用setDataBuffer()方法,以提供每次迭代的数据,然后是executeArrayUpdate(int arrayLength)方法。arrayLength参数指定每个缓冲区中提供的元素数量。下面的例子演示了如何使用executeArrayUpdate()方法插入记录
Statement *stmt = conn->createStatement("insert into departments (department_id, department_name) values(:1, :2)");
char dnames[][100] = {"Community Outreach", "University Recruiting"};
ub2 dnameLen[2];
for (int i = 0; i < 2; i++)
dnameLen[i] = strlen(dnames[i]) + 1;
int ids[2] = {7369, 7654};
ub2 idLen[2] = {sizeof(ids[0]), sizeof(ids[1])};
stmt->setDataBuffer(1, ids, ACCIINT, sizeof(ids[0]), idLen);
stmt->setDataBuffer(2, dnames, ACCI_SQLT_STR, sizeof(dnames[0]), dnameLen);
stmt->executeArrayUpdate(2); // 插入两行的数据。