如何在OCCI setDataBuffer中使用vector <string>?</string>

时间:2012-06-02 15:31:01

标签: c++ oracle occi

我有一个名为mytable2的简单表,只有一列,名称为varchar2(20)。 我现在有一个名称列表存储为要插入表中的std :: string的向量。 我想使用executeArrayUpdate,所以我必须先做setDataBuffer。 但是,正如我所看到的,人们总是使用char [] [20]来设置数据缓冲区。

这让我头疼,因为我在这里有两个问题,第一个是从vector转换为数组,第二个是将字符串转换为char。

1,我厌倦了使用char [20]的向量,这不编译。谷歌搜索,他们说矢量不能采取char [],所以我将std :: string的矢量改为char *的矢量。

第二,我试图通过使用“void * p =&amp; names [0]”将矢量转换为arrray,因为有些人这样说我们可以使用矢量作为数组。

我使用stmt-&gt; setDataBuffer(1,mystring,OCCI_SQLT_STR,20,NULL),程序编译和执行正常,但是当我“从mytable2中选择名字”时,它只显示了一些奇怪的字符。

之前有人遇到过类似问题吗?我该怎么办?

我的代码很简单,如下所示:

    count=2;
    vector<char*> mystring;
    for(int i=0;i<count;i++)
    {
        char my[20];
        strcpy_s(my,"Michael");
        mystring.insert(mystring.end(),my);
             }
    stmt->setDataBuffer(1,&mystring[0],OCCI_SQLT_STR,20,NULL);

    stmt->setBatchErrorMode (true);

    stmt->executeArrayUpdate(count);

1 个答案:

答案 0 :(得分:1)

您需要动态创建要放入向量中的char数组,以使其有可能正常工作。

我没有使用过OCCI,但如果我不得不使用要求char [] [20]的API,我会给它char [] [20]

如果您在vector中有现有数据,为什么不将它复制到2D char数组中?例如

// intialise vector with nonsense
unsigned int const VEC_SIZE = 2 ;
vector<string> v;
for (unsigned int i = 0; i < VEC_SIZE; ++i) {
    stringstream s;
    s << "Jon Paul " << i << endl;
    v.push_back ( s.str() ) ;
}

// create the required 2D char array
unsigned int const STR_LEN = 20 ;
char c [VEC_SIZE][STR_LEN];

// copy the data from the vector of strings to the 2D char array
for (unsigned int i = 0; i < VEC_SIZE; ++i) {
    string s = v[i].substr(0,STR_LEN);
    char const * const cc = s.c_str();      
    unsigned int j = 0;
    for (; j < STR_LEN && j < s.size(); ++j) {
        c[i][j] = cc[j];
    }
    c[i][ j==STR_LEN ? 20 : j ] = 0; // write NULL character
}

我认为你已经将你的例子简化为一个固定大小的矢量,所以我的反应将被简化为,将2D阵列动态分配的棘手问题留作读者的练习...... / p>