0

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

文档说:

对于字符串/RAW 数组,输入数组必须是连续的数据块,而不是指针数组。因此,要为 varchar2(30) 列绑定 10 个元素的数组,绑定变量必须是类似的数组 [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<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;
    ...
}
...

第一种方法给了我数据库中的错误数据。第二个让我碰到一个空指针。

我做错了什么?

PS

第二种方法,与下面 Alessandro Vergani 提出的方法一样,会插入空字符串。第一种方法给出了这个(有点奇怪)的结果:

数据库内容

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

4

1 回答 1

1

(尝试:

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);
    ...        
}
...

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

于 2011-02-03T15:52:44.097 回答