티스토리 뷰

목표 : 대화상자 기반으로 ADO를 활용하여 DB와 연동하기

소주제 : ADO 사용하여 DB 연결 시 List Control 핸들하기(컬럼 개수파악해서 표시)

Visual Studio 2012


1. Flag용 변수 추가 및 초기화


// Dialog1.h
// CDialog1 대화 상자입니다.

class CDialog1 : public CDialogEx
{
	...
private:
	int m_ColumnIdx;	//테이블 컬럼 인덱스
	char m_ColumnName[10][100];	//테이블 컬럼명
	BOOL isReadOnce;	//처음 연결 Flag
	...
}


// Dialog1.cpp : 구현 파일입니다.
//
//변수 초기화
CDialog1::CDialog1(CWnd* pParent /*=NULL*/)
	: CDialogEx(CDialog1::IDD, pParent)
{
	m_ColumnIdx=0;
	isReadOnce=FALSE;
}


2. OnInitDialog()에 설정했던 m_ctrList.InsertColumn 구문 지우기.


3. DB컬럼 읽고 리스트 컨트롤에 컬럼 추가하는 함수 구현


void CDialog1::dbReadColumn(void)
{
	//테이블 student 에 생성된 컬럼 명 읽기
	m_Adodb.m_pComm->CommandText = "select COLUMN_NAME from information_schema.columns where table_name = 'student';";
	try
	{
		m_Adodb.m_pRs = m_Adodb.m_pComm->Execute(NULL,NULL, adCmdText);
	}
	catch (...)
	{
		MessageBox("Column index 조회오류!", "ADO DB",MB_ICONSTOP);
		return;
	}
	
	// 결과가 존재하지 않음
	if (m_Adodb.m_pRs->adoEOF)
	{
		m_Adodb.m_pRs->Close();   // 레코드셋을 닫는다.(항상 레코드셋 오픈 후엔 닫아주는 작업을 수행해야 합니다.)
		MessageBox("조회할 데이터가 없습니다", "ADO DB", MB_ICONINFORMATION);
		return;
	}

	while(!m_Adodb.m_pRs->adoEOF)
	{
		//DB에서 해당 필드를 읽어들임
		_variant_t Field_ColumnName = m_Adodb.m_pRs->Fields->GetItem("COLUMN_NAME")->GetValue();
		
		// 저장된 variant변수를 조작이 편한 char변수에 복사합니다.
		if(m_ColumnIdx<10)	//컬럼 갯수는 10개로 제한
			strcpy_s(m_ColumnName[m_ColumnIdx++], (char*)((_bstr_t)Field_ColumnName));

		m_Adodb.m_pRs->MoveNext();    // 레코드셋을 다음으로 이동시킵니다.
	}

	//List Control에 컬럼 추가
	for (int i=0; i < m_ColumnIdx; i++)
	{
		m_ctrList.InsertColumn(i,m_ColumnName[i], LVCFMT_LEFT, 50);
	}
}


4. DB연결 버튼 클릭 함수 수정 


void CDialog1::OnBnClickedBtnConnect()
{
	// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
	if(m_Adodb.isConnected==false)
	{
		if(m_Adodb.InitDB("sa", "dbtest", "127.0.0.1","dbTest","1433") == FALSE)
		{
			MessageBox("디비접속에러","ADO DB",MB_ICONSTOP);
			return;
		}
		else
		{
			MessageBox("연결 성공!");

			//처음 연결 될 시에만 확인
			if(isReadOnce==FALSE)
			{
				CDialog1::dbReadColumn();
				isReadOnce=TRUE;
			}
		}

		SetDlgItemText(IDC_BTN_CONNECT,"DB 연결 해제");
	}
	else
	{
		// db연결 해제
		m_Adodb.ReleaseDB();
		SetDlgItemText(IDC_BTN_CONNECT,"DB 연결");
		m_ctrList.DeleteAllItems();
	}
}


* 테스트!


0

댓글