应用程序管理的数据缓冲

当通过参数化语句中的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);     // 插入两行的数据。