2011-02-03 39 views
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提出的方法,導致空字符串插入。第一種方法給出了這樣的(有點怪異)結果:

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緩衝區爲零因爲沒有必要使用空終止符,我不明白這和我發佈的第一種方式有什麼不同 - 你能解釋一下嗎?結果是一樣的 – 2011-02-03 16:45:35