【问题标题】:Filling a string buffer when using Ocilib使用 Ocilib 时填充字符串缓冲区
【发布时间】:2011-02-03 15:03:46
【问题描述】:

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

文档说:

对于字符串/RAW 数组,输入数组 必须是连续的数据块,并且 不是指针数组。所以要绑定 一个包含 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);
}
...

我试图在循环通过 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 窗口显示它应该是什么样子,顶点屏幕显示最终在数据库中的内容。

【问题讨论】:

    标签: c++ c oracle-call-interface


    【解决方案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 并删除第二行。

    【讨论】:

    • Vergani 缓冲区是零填充的,因此不需要空终止符。我看不出这与我发布的第一种方式有何不同 - 你能解释一下吗?结果是一样的。
    • 区别主要在于如何分配缓冲区(通过您的代码而不是库)。顺便说一句:您发布的第一个示例有效吗?
    • 我进行了修复(根据 OCILIB 文档,更改了缓冲区的大小以包含空终止符)。试试看
    • 糟糕,在您更改答案时编辑了问题。我会再试一次并再次更新问题。
    • Vergani 我真的很感激!考虑到大小加一,由于空终止符,全部修复!我从未在文档中看到过。谢谢!
    猜你喜欢
    • 2013-06-12
    • 2017-05-30
    • 1970-01-01
    • 2012-02-04
    • 2011-02-20
    • 1970-01-01
    • 2017-01-05
    • 2012-04-27
    • 1970-01-01
    相关资源
    最近更新 更多