0
我正在使用Ocilib在Oracle數據庫上執行批量插入,但填寫字符串緩衝區時遇到了一些麻煩。在使用Ocilib時填充字符串緩衝區
文檔說:
對於字符串/ 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的窗口顯示了它應該是什麼樣子,頂點屏幕顯示了在數據庫中結束。
Vergani緩衝區爲零因爲沒有必要使用空終止符,我不明白這和我發佈的第一種方式有什麼不同 - 你能解釋一下嗎?結果是一樣的 – 2011-02-03 16:45:35