2011-02-03 9 views
0

私はOcilibを使用してOracleデータベースに一括挿入を実行していますが、文字列バッファを埋めるのにいくつかの問題があります。Ocilibを使用するときに文字列バッファを埋める

ドキュメントは言う:文字列/ 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; 
    ... 
} 
... 

最初の方法では、データベースにバグの多いデータが表示されます。 2番目は私にヌルポインタを当てます。

私は間違っていますか?

PS

以下のAlessandro Vergani、挿入されたヌル文字列で結果によって提案されたアプローチに沿って第二のアプローチ、。

database contents

のgvimのウィンドウは、頂点画面がデータベースに終わるかを示して、見えるようになっているものを示しています。最初のアプローチは、この(やや奇妙な)結果を提供します。

答えて

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を削除し、削除しない場合

+0

Verganiバッファがゼロでありますしたがって、nullターミネータは必要ありません。私が最初に投稿したやり方とどのように違うのか分からないのですが、結果は同じです –

+0

違いは主にバッファの割り当て方法ですあなたのコードをライブラリではなく)あなたが仕事を投稿した最初の例は? – Loghorn

+0

私は修正を行いました(buffのサイズを変更しましたOCILIBのマニュアルに従ってヌル・ターミネータを含めるようにしてください)。試してみてください – Loghorn

関連する問題