使用Ocilib时填充字符串缓冲区

我正在使用Ocilib在Oracle数据库上执行批量插入,但是在填充字符串缓冲区时遇到了一些麻烦。

文件说:

对于字符串/ RAW数组,输入数组必须是连续的数据块而不是指针数组。 因此,要为varchar2(30)列绑定10个元素的数组,binded变量必须是类似的数组[10] [31]

然后一个样本继续填充这样的缓冲区:

... char tab_str[1000][21]; ... OCI_BindArrayOfStrings(st, ":s", (char*) tab_str, 20, 0); ... for(i=0;i<1000;i++) { sprintf(tab_str[i],"Name %d",i+1); } ... 

我正在尝试填充字符串缓冲区,同时循环通过MyClass的std :: vector。 MyClass有一个std :: string成员。

我正在尝试使用std :: string :: copy方法将字符串内容复制到缓冲区。 但我不知道如何索引缓冲区来做到这一点。

 ... OCI_BindArrayOfStrings(st, ":f2", NULL, VCHAR_SIZE, 0); char** vc_buffer = (char**)OCI_BindGetData(OCI_GetBind(st, 2)); ... int i = 0; for(vector::const_iterator it = myVec.begin(); it != myVec.end(); ++it) { /* 1st try */ it->m_string.copy((vc_buffer + (i * VCHAR_SIZE)), VCHAR_SIZE); /* 2nd try */ it->m_string.copy(vc_buffer[i], VCHAR_SIZE); ++i; ... } ... 

第一种方式为我提供了数据库中的错误数据。 第二个让我点击一个空指针。

我做错了什么?

PS

第二种方法,沿着Alessandro Vergani提出的方法,导致插入空字符串。 第一种方法给出了这个(有点奇怪)的结果:

数据库内容

gvim窗口显示它应该是什么样子,顶点屏幕显示最终在数据库中的内容。

(尝试:

 std::vector tab_str(myVec.size() * (VCHAR_SIZE + 1)); ... OCI_BindArrayOfStrings(st, ":s", &tab_str[0], VCHAR_SIZE, 0); ... int offset = 0; for(vector::const_iterator it = myVec.begin(); it != myVec.end(); ++it, offset += VCHAR_SIZE) { it->m_string.copy(&tab_str[offset], VCHAR_SIZE); ... } ... 

我不确定您是否需要添加空终止符:如果不是,请从副本中删除-1并删除第二行。