티스토리 뷰

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

소주제 : List Control과 DB Table 연동

Visual Studio 2012


- DB는 Windows Server 2014 Express로 미리 작업하여 테이블 구축해 놓음

- DB명 : dbTest 테이블 명 : student, 속성 : ID(int), NAME(text)


1. 테이블 연동 용 List Control/ DB 연결용 버튼 생성

 * List Control 생성 후 속성 - 모양 - View - Report로 변경

 * List Control 컨트롤 변수 추가 m_ctrList



2. CMyAdodb 변수 생성


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

class CDialog1 : public CDialogEx
{
	...
private:
	CMyAdodb m_Adodb;
};


2. List Control에 테이블 속성 추가


 * Ex) ID, NAME



// CModelessDDlg 메시지 처리기
BOOL CModelessDDlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	...

	// TODO: 여기에 추가 초기화 작업을 추가합니다.
	isDlgInit = TRUE;
	
	m_dlg1 = new CDialog1;
	m_dlg1->Create(IDD_DIALOG1);
	
	m_dlg1->m_ctrList.InsertColumn(0,"ID",LVCFMT_LEFT, 50);
	m_dlg1->m_ctrList.InsertColumn(1,"NAME",LVCFMT_LEFT, 80);

	return TRUE;  // 포커스를 컨트롤에 설정하지 않으면 TRUE를 반환합니다.
}


3. DB 연결 시 테이블 값 읽어오는 루틴 추가


 * 헤더에 함수 원형 추가(void CDialog1::dbReadTable(void);)


void CDialog1::dbReadTable(void)
{
	//리스트 컨트롤 초기화
	m_ctrList.DeleteAllItems();
	m_Adodb.m_pComm->CommandText = "select * from dbo.student";
	try
	{
		m_Adodb.m_pRs = m_Adodb.m_pComm->Execute(NULL,NULL, adCmdText);
	}
	catch (...)
	{
		MessageBox("조회오류!", "SIMPLEDB",MB_ICONSTOP);
		return;
	}

	// 결과가 존재하지 않음
	if (m_Adodb.m_pRs->adoEOF)
	{
		m_Adodb.m_pRs->Close();   // 레코드셋을 닫는다.(항상 레코드셋 오픈 후엔 닫아주는 작업을 수행해야 합니다.)
		MessageBox("조회할 데이터가 없습니다", "SIMPLEDB", MB_ICONINFORMATION);
		return;
	}

	// 읽어들인 DB 필드를 문자열로 저장하는 변수
	char szField_ID[100] = { '\0', };  // 필드명과 1:1대응하게 변수를 선언하십시요
	char szField_NAME[100] = { '\0', };

	// DB에서 얻은 값이 삽입될 리스트의 인덱스 입니다.
	int iCount = 0;

	// 조회된 레코드의 끝까지 루핑을 돌며 데이터를 확인합니다.
	while (!m_Adodb.m_pRs->adoEOF)
	{
		// DB에서 해당 필드를 읽어들임
		_variant_t Field_ID = m_Adodb.m_pRs->Fields->GetItem("ID")->GetValue();
		_variant_t Field_NAME = m_Adodb.m_pRs->Fields->GetItem("NAME")->GetValue();

		// 저장된 variant변수를 조작이 편한 char변수에 복사합니다.
		strcpy_s(szField_ID, (char*)((_bstr_t)Field_ID));
		strcpy_s(szField_NAME, (char*)((_bstr_t)Field_NAME));

		// 가져온 값을 List control에 출력한다. 
		int Index = m_ctrList.InsertItem(iCount, szField_ID, 0);
		m_ctrList.SetItemText(Index, 1, szField_NAME);

		// 리스트 컨트롤을 추가하셨거나 화면에 출력하실 생각이 있으시다면 
		// 루핑을 돌리며 값을 채워넣는 작업을 이부분에서 하시면 됩니다.
		m_Adodb.m_pRs->MoveNext();    // 레코드셋을 다음으로 이동시킵니다.
		iCount++;      // 다음 레코드를 읽어들일 때 다음 줄에 삽입 할 수 있도록 증가시킨다.
	}
	m_Adodb.m_pRs->Close();           // 레코드셋을 닫아줍니다.
}


4. 버튼 클릭시 DB 연결하고 테이블 값 읽어오는 루틴 추가


 * m_Adodb.InitDB("유저","비밀번호","IP","DB이름","포트번호(기본값:1433)")

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

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

5. 컴파일 및 테스트


댓글