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

C++ 使用Ocilib时填充字符串缓冲区,c++,c,oracle-call-interface,C++,C,Oracle Call Interface,我使用在Oracle数据库上执行大容量插入,但在填充字符串缓冲区时遇到了一些问题 文件说: 对于字符串/原始数组,输入数组 必须是连续的数据块,并且 不是指针数组。所以绑定 一个数组的10个元素 varchar2(30)列,绑定变量 必须是类似数组[10][31] 样本继续填充缓冲区,如下所示: ... char tab_str[1000][21]; ... OCI_BindArrayOfStrings(st, ":s", (char*) tab_str, 20, 0); .

我使用在Oracle数据库上执行大容量插入,但在填充字符串缓冲区时遇到了一些问题

文件说:

对于字符串/原始数组,输入数组 必须是连续的数据块,并且 不是指针数组。所以绑定 一个数组的10个元素 varchar2(30)列,绑定变量 必须是类似数组[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);
}
...
。。。
char tab_str[1000][21];
...
OCI_BindArrayOfStrings(st,“:s”,(char*)tab_str,20,0);
...
对于(i=0;i(尝试:

std::vector tab_str(myVec.size()*(VCHAR_size+1));
...
OCI_BindArrayOfStrings(st,:s,&tab_str[0],VCHAR_大小,0);
...
整数偏移=0;
对于(vector::const_迭代器it=myVec.begin();it!=myVec.end();++it,偏移量+=VCHAR_大小)
{
it->m_string.copy(&tab_str[offset],VCHAR\u SIZE);
...        
}
...

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

Vergani缓冲区是零填充的,因此不需要空终止符。我看不出这与我发布的第一种方式有什么不同-你能解释一下吗?结果是一样的。区别主要是n如何分配缓冲区(由您的代码而不是库)。顺便说一句:您发布的第一个示例有效吗?我做了一个修复(根据OCILIB文档,更改了缓冲区的大小以包括空终止符)。请尝试itOops,在您更改答案时编辑了问题。我将重试并再次更新问题。Vergani我真的很感谢!考虑到大小加1,由于空终止符,已全部修复!我从未在文档中看到过。谢谢!
...
OCI_BindArrayOfStrings(st, ":f2", NULL, VCHAR_SIZE, 0);
char** vc_buffer = (char**)OCI_BindGetData(OCI_GetBind(st, 2));
...
int i = 0;
for(vector<MyClass>::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;
    ...
}
...
std::vector<char> tab_str(myVec.size() * (VCHAR_SIZE + 1));
...
OCI_BindArrayOfStrings(st, ":s", &tab_str[0], VCHAR_SIZE, 0);
...
int offset = 0;
for(vector<MyClass>::const_iterator it = myVec.begin(); it != myVec.end(); ++it, offset += VCHAR_SIZE)
{
    it->m_string.copy(&tab_str[offset], VCHAR_SIZE);
    ...        
}
...