2012-06-02 82 views
2

我有一個名爲mytable2的簡單表,只有一列,名稱爲varchar2(20)。 我現在有一個存儲爲std :: string向量插入到表中的名稱列表。 我想使用executeArrayUpdate,所以我必須先setDataBuffer。 但是,正如我所看到的,人們總是使用char [] [20]來設置databuffer。如何在OCCI setDataBuffer中使用矢量<string>?

這讓我非常頭疼,因爲我在這裏有兩個問題,第一個是將矢量轉換爲數組,第二個是將字符串轉換爲char。

1,我厭倦了使用char [20]向量,並且這個不能編譯。谷歌搜索,他們說矢量不能採取char [],所以我改變了我的std :: string向量爲char *的向量。

第二,我試圖用「void * p = & names [0]」把這個向量變成arrray,就像有人說這樣我們可以像使用數組一樣使用向量。

我用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); 

回答

0

你需要動態地創建你把載體中的字符數組爲它有正常工作的機會。

我沒有使用OCCI,但如果我不得不使用API​​,它要求的char [] [20],我想給它的char [] [20]

如果您在矢量現有的數據,爲什麼不把它複製到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 
} 

我想你已經簡化你的例子是一個固定大小的矢量,所以我的迴應將被簡化爲,與二維數組的動態分配的棘手問題作爲練習留給讀者...

+0

非常感謝您的回答。 – Michael

+0

非常感謝您的回答。我打算用OCCI函數來查詢插入,刪除和更新表(任何表),這樣我就必須給出的是字段名和值,然後程序應該自動讀取模式,並生成sql並插入到oracle中。我曾經在OPN.Net中這樣做過,但我希望我的程序性能很好,所以我再次使用C++編寫所有程序,包括算法,數據庫,webservice等。我認爲我可能需要編寫一些函數來轉換這些向量類似char **? – Michael

+0

是的。您可以通過使您的轉換功能也可以打電話給OCCI,讓自己的生活更輕鬆。在開始所有這些之前,我想知道用C++重新實現一切會讓事情變得更快。您需要一些方法來分析現有.Net代碼中的瓶頸。 – wreckgar23