Open Source RDBMS - Seamless, Scalable, Stable and Free

한국어 | Login |Register


0
(click on this box to dismiss)

CCI_BIND_PARAM 에서 CCI_BIND_PTR 사용시 오류

cubrid cci 매뉴얼에서 제공하는 샘플 소스에 바인딩하는 변수에 대한 테스트를 해보다 오류를 발견하게 되었습니다.

아래가 제가 테스트한 코드입니다.

 

int _tmain(int argc, char *arg[])

{

    int con = 0, req = 0, col_count = 0, i, ind;

    int error;

    char *data;

    T_CCI_ERROR cci_error;

    T_CCI_COL_INFO *col_info;

    T_CCI_CUBRID_STMT stmt_type;

    char *query = "select * from nation where name = ?";

char namebuf[128] = {"Korea"};  // 변수 초기화값을 테이블에 존재하지않는 값으로 하면 조회안됨

 

printf("\nselect_bind_sample : select * from nation where name = ?\n");

printf("-------------------------------------------------\n");

    //getting a connection handle for a connection with a server

    con = cci_connect (DBHOST, DBPORT, "demodb", DBUSER, DBPASSWD);

    if (con < 0)

    {

        printf ("cannot connect to database\n");

        return 1;

    }

 

    //preparing the SQL statement

    req = cci_prepare (con, query, 0, &cci_error);

    if (req < 0)

    {

        printf ("prepare error: %d, %s\n", cci_error.err_code,

                cci_error.err_msg);

        goto handle_error;

    }

    //getting column information when the prepared statement is the SELECT query

    col_info = cci_get_result_info (req, &stmt_type, &col_count);

    if (col_info == NULL)

    {

        printf ("get_result_info error: %d, %s\n", cci_error.err_code,

                cci_error.err_msg);

        goto handle_error;

}

 

 

//Binding date into a value

error =

cci_bind_param (req, 1, CCI_A_TYPE_STR, namebuf, CCI_U_TYPE_STRING, CCI_BIND_PTR);

if (error < 0)

{

printf ("bind_param error: %d ", error);

goto handle_error;

}

for(int j=0;j<3;j++) {

// 다른 값으로 변경하여 쿼리 조회

if(j==0) strcpy (namebuf, "Korea");

if(j==1) strcpy (namebuf, "Japan");

if(j==2) strcpy (namebuf, "Chile");

printf("bind value : %s\n", namebuf);

//Executing the prepared SQL statement

error = cci_execute (req, 0, 0, &cci_error);

if (error < 0)

{

printf ("execute error: %d, %s\n", cci_error.err_code,

cci_error.err_msg);

goto handle_error;

}

while (1)

{

 

//Moving the cursor to access a specific tuple of results

error = cci_cursor (req, 1, CCI_CURSOR_CURRENT, &cci_error);

if (error == CCI_ER_NO_MORE_DATA)

{

break;

}

if (error < 0)

{

printf ("cursor error: %d, %s\n", cci_error.err_code,

cci_error.err_msg);

goto handle_error;

}

 

//Fetching the query result into a client buffer

error = cci_fetch (req, &cci_error);

if (error < 0)

{

printf ("fetch error: %d, %s\n", cci_error.err_code,

cci_error.err_msg);

goto handle_error;

}

for (i = 1; i <= col_count; i++)

{

 

//Getting data from the fetched result

error = cci_get_data (req, i, CCI_A_TYPE_STR, &data, &ind);

if (error < 0)

{

printf ("get_data error: %d, %d\n", error, i);

goto handle_error;

}

printf ("%s\t|", data);

}

printf ("\n");

}

}

 

    //Closing the request handle

    error = cci_close_req_handle (req);

    if (error < 0)

    {

        printf ("close_req_handle error: %d, %s\n", cci_error.err_code,

                cci_error.err_msg);

        goto handle_error;

    }

 

    //Disconnecting with the server

    error = cci_disconnect (con, &cci_error);

    if (error < 0)

    {

        printf ("error: %d, %s\n", cci_error.err_code, cci_error.err_msg);

        goto handle_error;

    }

 

    return 0;

 

handle_error:

    if (req > 0)

        cci_close_req_handle (req);

    if (con > 0)

    cci_disconnect (con, &cci_error);

 

    return 1;

}

결과 : 
select_bind_sample : select * from nation where name = ?
-------------------------------------------------
bind value : Korea
KOR     |Korea  |Asia   |Seoul  |
bind value : Japan
JPN     |Japan  |Asia   |Tokyo  |
bind value : Chile
CHI     |Chile  |Americas       |Santiago       |
cci_bind_param 에서 사용한 namebuf에 대한 초기값을  char namebuf[128] = {"Korea"}; 처럼 테이블에 존재하는 값으로 하면 정상처리됩니다.
하지만  char namebuf[128] = {""}; 로 초기화 하였을 경우엔 정상작동하지 않습니다. 다른값으로 초기화 하여도 마찬가집니다.
CCI_BIND_PTR 타입으로 바인딩하면 포인터에 대한 복사가 이뤄지는 방식으로 매뉴얼에는 적혀있는데 정상적으로 작동하지 않는거 같습니다.
원인이 무엇인지 알려주세요.
char namebuf[128] = {""};  로 초기화하였을 경우 결과
select_bind_sample : select * from nation where name = ?
-------------------------------------------------
bind value : Korea
bind value : Japan
bind value : Chile
link comment (0)
asked last year
liberianua
1
1 Answer
0

http://dev.naver.com/projects/cubrid/issue/65492 의 답변을 참고하시기 바랍니다.

 

감사합니다.

link comment (0)
answered 8 months ago
brightest
1
tagged




You are either using a very old browser or a browser that is not supported.
In order to browse cubrid.org you need to have one of the following browsers:



Internet Explorer: Mozilla Firefox: Google Chrome: