LOGIN • JOININ

SIMPLE SQL QUERY (2)

[Tutorials/[Server] 4. Query classes/Tutorial_Query02_SQL-Simple(2)]



SQL DB와 접속 문자열이나 쿼리문을 직접 작성하지 않고 자동적으로 Accessor를 행성한 후  Accessor를 사용해 쿼리하고 그 결과를  처리하는 것을 지원합니다.

Accessor는 넘겨지는 파라메터나 Row값을 저장하는 변수들을 가지고 있습니다.

또 쿼리가 완료되면 Row값을 저장하는 변수에 결과값들이 바로 매핑되어 손쉽게 값을 읽거나 쓰도록 해줍니다.

또 Accessor의 경우 Visual Studio의 Add ‘Class>>ATL>>ATL OLEDB Consumer’를 사용하면 자동으로 만들 수 있어 손쉽게 Query 처리를 할수 있습니다.


1... ATL OLEDB Consumer로 Query 자동으로 만들기

1) 일단 ‘PROJECT>>Add Class’ 메뉴를 엽니다.

ATLOLEDB_AddClass_X00.png


2) ATL탭을 선택하고

3) ATL OLEDB Consumer를 선택한다.

ATLOLEDB_AddClass_X01.png


4) 아래와 같은 메뉴가 뜨면 ‘Data Source’ 버튼을 클릭합니다.

ATLOLEDB_AddClass_X02.png


5) 데이터 연결 속성을 선택합니다.

MSSQL일 경우 ‘Microsoft OLE DB Provider for SQL Server’를 선택합니다.

MySQL일 경우 ‘Microsoft OLE DB Provider for ODBC Drivers’를 선택합니다.

또 MySQL용 ODBC 드라이버를 다운받아 설치하고 제어판의 ‘관리도구>>데이터 본(ODBC)’에 ‘사용자DSN’에 MySQL서버를 등록해 주어야 합니다.)

ATLOLEDB_AddClass_X03.png



6) ‘데이터 원본 사용’을 선택하고 사전에 등록된 ODBC를 선택합니다.

7) DB ‘사용자 이름’과 ‘암호’를 입력하고 사용할카탈로그를 선택합니다. 이때 ‘암호저장 허용’을 체크하면 입력한 암호가 접속스트링을 만들며 추가됩니다. 따라서 노출될 수 있다는 경고 창이 출력될 수 있습니다.

8) ‘데이터원본’과 ‘사용자이름’, ‘암호’가 정확히 입력되어 DB와 접속에 성공했다면 카탈로그 콤보박스에서 선택할 수 있습니다.

9) 확인을 누릅니다.

ATLOLEDB_AddClass_X05.png




10) 아래와 같은 데이터베이스 객체 선택 창이 뜨면 Query를 할 대상 객체를 선택하고

11) OK버튼을 누릅니다. 

ATLOLEDB_AddClass_X06.png


12) 여기까지 완료를 했다면 최종적으로 생성할 Accessor의 이름과 파일이름이 표시됩니다.

13) 클래스 이름과 파일이름을 설정했다면 ‘Finish’버튼을 눌러 설정을 완료합니다.

ATLOLEDB_AddClass_X07.png




2... ATL OLEDB Consumer로 만들어진 클래스들 확인하기

1) 성공적으로 클래스 생성을 완료하면 아래와 같이 생성된 Accessor가 작성된 소스파일이 추가됩니다.

ATLOLEDB_AddClass_X09.png


2) 소스 파일에는 두 개의 클래스가 있습니다. 하나는 ‘~Accessor’ 클래스이고 나머지 하나는 그 Accessor를 사용해 만든 접속용 클래스입니다.

3) ~Accessor 클래스

아래는 ~Accessor 클래스입니다.

이 Accessor 클래스를 활용하여 Query객체를 손쉽게 만들 수 있습니다.

Accessor에는 Query한 결과 하나의 Row의 Column값이 자동으로 맵핑되는 변수들이 있으며 이 변수를 사용해 손쉽게 Row값을 읽어들일 수 있습니다. 

4) OpenDataSource() 함수

억세스 객체의 OpenDataSource()함수에는 DB에 접속하기 위한 ‘접속 문자열’이 출력되어 있습니다.

이 값은 Querier를 Open()할 때 그대로 사용 가능합니다.

5) DEFINE_COMMAND_EX의 문자열은 Query를 수행할 문자열입니다. 



3... Accessor 클래스로 Query 요청하기

자동으로 생성한 Accessor 클래스를 Query객체를 정의해 생성할 수 있습니다. 

// @1) Query 객체를 생성한다.(CCharacterAccessor를 Accessor로 사용했다.)
auto	pQuery	 = NEW<DB::CQuery<CAccessor<CCharacterAccessor>>>();

// 2) 바로 Query를 건다.
auto	hResult	 = g_pQuerier->RequestQuery(pQuery);

// Check) Query에 실패했으면 pQuery를 nullptr로 리턴한다.
ERROR_THROW_IF(hResult!=S_OK, CGException::CThrow_Failure(), );

// 3) for문을 사용해 Query결과를 차례로 읽어들인다.
for(auto& iter:*pQuery)
{
	wprintf(TEXT("id:%d idType:%d Name:%ls\n"), 
		iter.m_id,
		iter.m_idType,
		iter.m_Name);
}

1) 자동생성된 ‘CCharacterAccessor’를 Accessor로 Query객체를 생성했습니다.

2) 생성한 Query 객체로 RequestQuery를 요청합니다. 

3) for문을 사용하여 결과를 차례로 읽어들입니다. 


Accessor를 사용하면 GetValue()등과 같은 함수로 값을 일일이 읽어올 필요 없이 자동으로 Accessor 내의 변수에 맵핑되기 때문에 변수의 값을 읽어 쓰기만 하면 됩니다.