2012-06-02 5 views
2

나는 이름이 varchar2 (20) 인 열만있는 mytable2라는 간단한 테이블을 가지고 있습니다. 이제 테이블에 삽입 할 std :: string의 벡터로 저장된 이름 목록을 갖게되었습니다. executeArrayUpdate를 사용하려고하므로 먼저 setDataBuffer를 수행해야합니다. 그러나 볼 수 있듯이 사람들은 항상 char [] [20]을 사용하여 데이터 버퍼를 설정합니다.OCCI setDataBuffer에서 벡터 <string>을 사용하는 방법?

두 가지 문제가 있기 때문에 첫 번째는 벡터에서 배열로 변환하고 두 번째는 char로 문자열을 변환하는 것이므로 큰 두통이 남습니다.

첫째, 나는 char [20]의 벡터를 사용하는 데 지쳤으며 이것은 컴파일되지 않습니다. 인터넷 검색 및 그들은 vector [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

올바르게 작동의 기회를 가지고 당신은 동적으로 벡터에두고있는 char 배열을 만드는 데 필요한 것입니다.

내가 OCCI 사용하지 않은,하지만 난 문자를 요구 API를 사용했다 경우 []는 [20], 당신이 당신의 벡터 데이터를 기존의 경우는 [] [20]

를 숯불 줄 것이다, 왜 2D 문자 배열로 가로 질러 복사하지 않는가? 예 : 내 대답은 독자들에게 숙제로 남긴다 2 차원 배열의 동적 할당의 어려운 문제를,로 단순화 할 것입니다 수 있도록

// 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을 생성해야한다. 오라클에 삽입하십시오. 예전에는 OPN.Net에서 그렇게 했었지만, 알고리즘, 데이터베이스, 웹 서비스 등을 포함하여 C++의 모든 것을 다시 작성하기 위해 프로그램의 성능을 높이고 싶습니다. 이러한 벡터를 변환하는 데 필요한 일부 함수를 작성해야한다고 생각합니다. 같은 문자 **에? – Michael

+0

예. 당신은 아마도 당신의 변환 기능이 OCCI에 전화를 걸음으로써 삶을 편하게 만들 수 있습니다. 모든 것을 시작하기 전에 C++의 모든 것을 다시 구현하면 모든 것이 더 빨라진다는 것을 알고 싶습니다. 기존 .Net 코드의 병목 현상을 분석 할 방법이 필요합니다. – wreckgar23