2

varchar2(20)という名前の列が1つしかないmytable2という単純なテーブルがあります。これで、テーブルに挿入するstd::stringのベクトルとして保存されている名前のリストができました。executeArrayUpdateを使用したいので、最初にsetDataBufferを実行する必要があります。しかし、私が見ることができるように、人々は常にchar[][20]を使用してデータバッファを設定します。

ここでは2つの問題があるため、これは大きな頭痛の種になります。1つはベクトルから配列に変換すること、2つ目は文字列をcharに変換することです。

第一に、char [20]のベクトルを使用するのに疲れましたが、これはコンパイルされません。Googledで、vectorはchar []を取ることができないと言われているので、std::stringのベクトルをchar*のベクトルに変更しました。

2番目に、「void * p =&names [0]」を使用してベクトルを不規則に変えようとしました。このように、ベクトルを配列と同じように使用できると言う人もいます。

stmt-> 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);
4

1 に答える 1

1

正しく機能するためには、ベクターに入れるchar配列を動的に作成する必要があります。

OCCIは使用していませんが、char [] [20]を要求するAPIを使用する必要がある場合は、char[][20]を指定します。

既存のデータがベクターにある場合は、それを2D文字配列にコピーしてみませんか?例えば。

// 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配列の動的割り当ての厄介な問題で単純化されるでしょう...

于 2012-06-02T18:47:00.943 に答える