2007. 11. 23. 16:21

::: 결과값 처리 :::
이번장에서는 SQL문을 수행한 후 반환되는 결과값을 다루는 방법에 대해서 알아본다.

쿼리를 수행한 후 반환되는 레코드들의 그룹을  결과셋이라고 부른다.(result set)이러한
결과셋을 처리하는데는 다음과 같은 절차를 따른다.

1. 가능할 경우 결과셋을 갱신한다.(Select 문)
2. 결과셋의 각 컬럼과 대응대는 변수를 바인딩한다.
3. 열을(레코드) 가져온다.

참고로, 결과셋을 가져왔다면,
SQLCloseCursor.프로시져를 호출해서 커서를
해제해 주어야 한다. (결과셋을 소거하는 역활을 한다 : 재사용)



::: 결과셋 생성 :::

때때로, 결과값을 가지는 SQL문들이 존재할 수 있다.  이경우  SQLNumResultCols.프로
시져를 호출해서 결과셋의 컬럼수를 반드시 체크해 봐야 한다.

SQLNumResultCols proto StatementHandle:DWORD, pNumCols:DWORD
  • StatementHandle 명령핸들을 지정한다
  • pNumCols 결과셋의 컬럼수를 가지고 있는 포인터

만약,pNumCols 이 0을 포인트 하고 있다면, 결과셋이 없다는 의미이다.



::: 컬럼 바인딩 :::

결과셋으로 가져온 레코드의 각 필드와 1:1로 매핑 될 변수를 바인딩하는
것이다.SQLBindCol 프로시져를 호출해서 이작업을 수행 할 수 있다.

SQLBindCol proto StatementHandle:DWORD,
                            ColumnNumber:DWORD,
                            TargetType:DWORD,
                            TargetValuePtr:DWORD,
                            BufferLength:DWORD,
                            pStrLenOrIndPtr:DWORD
  • StatementHandle 명령핸들을 지정한다
  • ColumnNumber
    바인딩할 결과셋의 컬럼수를 지정한다. 컬럼수는 1 부터 시작한다. 컬럼수 0
    은 책갈피 컬럼(북마크)으로 사용된다.
  • TargetType TargetValuePtr 가 지정하는 변수(버퍼)의 타입을 지정한다.
  • TargetValuePtr
    컬럼과 바인딩된 변수 혹은 버퍼의 포인터.SQLFetch 프로시져로 결과셋을
    가져올 경우 바인딩된 변수(버퍼)에 결과를 채워넣게 된다.
  • BufferLength
    TargetValuePtr.가 지시하는 버퍼의 크기를 지정한다.
  • pStrLenOrIndPtr
    SQLBindParameter
    항목을 참고 하기 바란다.

코드샘플

.data?
buffer db 21 dup(?)
DataLength dd ?     ; SQLFetch 프로시져가 호출되면 버퍼의 크기가 설정된다.

.code
     .....
     invoke SQLBindCol, hStmt, 1, SQL_C_CHAR, addr buffer, 21, addr DataLength



::: 레코드 가져오기 :::

레코드를 가져오는 방법은 아주 단순하다. 단지, SQLFetch 프로시져를 호출하면 된다. 결과셋과 바인딩된 변수에 해당하는 값을 채워주는 프로시져인 것이다.
SQLFetch 프로시져가 호출되면 커서가 갱신된다. 커서는 레코드 포인터라고 생각하면
이해하기 쉬울 것이다. 예를 들어서 SQLFetch 프로시져를 호출한 결과로 4열의 레코드
가 발생했다면, 커서는 1열을 가르키게 된다. 다시  SQLFetch 프로시져를 3번더 호출
해야 모든열을 가져올 수 있는 것이다. 어디까지 가져온지는 커서를 통해서 알 수있다.
커서가 EOF(End of Field)를 가르키고 있다면 끝까지 가져온것이 된다.

SQLFetch proto StatementHandle:DWORD

더이상 가져올 레코드가 없다면 프로시져의 반환값은 SQL_NO_DATA 이다.

코드샘플

.data?
buffer db 21 dup(?)
DataLength dd ?

.code
     .....
     invoke SQLBindCol, hStmt, 1, SQL_C_CHAR, addr buffer, 21, addr DataLength
     invoke SQLFetch, hStmt

Posted by openserver