티스토리 뷰

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

소주제 : ADO 사용하여 DB 테이블 컬럼(필드) 추가 / 삭제

Visual Studio 2012


1. 다이얼로그에 필요한 컨트롤 추가

 * 버튼: DB읽기, 컬럼추가, 컬럼삭제

 * EDIT BOX: 컬럼명

 * DB 연결 후에 작동 가능하므로 기본 Disable 적용



2. DB 연결 시의 컨트롤 활성화/비활성화 적용


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

			//각 컨트롤 활성화
			GetDlgItem(IDC_BTN_COLADD)->EnableWindow(TRUE);
			GetDlgItem(IDC_BTN_COLDEL)->EnableWindow(TRUE);
			GetDlgItem(IDC_BTN_DBREAD)->EnableWindow(TRUE);
			GetDlgItem(IDC_EDIT_COL)->EnableWindow(TRUE);
			...
		}
		...
	}
	else
	{
		...
		//각 컨트롤 비활성화
		GetDlgItem(IDC_BTN_COLADD)->EnableWindow(FALSE);
		GetDlgItem(IDC_BTN_COLDEL)->EnableWindow(FALSE);
		GetDlgItem(IDC_BTN_DBREAD)->EnableWindow(FALSE);
		GetDlgItem(IDC_EDIT_COL)->EnableWindow(FALSE);
	}
}


3. DB읽기 버튼 클릭 함수 추가 및 기존 DB읽기 함수 수정


 - DB 읽기 버튼 클릭 함수


void CDialog1::OnBnClickedBtnDbread()
{
	// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
	CDialog1::dbReadTable();
}


 - DB 읽기 함수 수정


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("조회오류!", "ADO DB",MB_ICONSTOP);
		return;
	}

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

	// 읽어들인 DB 필드를 문자열로 저장하는 변수
	char szField_tmp[100] = { '\0',};

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

	// 조회된 레코드의 끝까지 루핑을 돌며 데이터를 확인합니다.
	while (!m_Adodb.m_pRs->adoEOF)
	{
		for (int i=0; i<m_ColumnIdx; i++)
		{
			// DB에서 해당 필드를 읽어들임
			_variant_t Field_tmp = m_Adodb.m_pRs->Fields->GetItem(m_ColumnName[i])->GetValue();

			// 저장된 variant변수를 조작이 편한 char변수에 복사합니다.
			if(Field_tmp.vt == VT_NULL)
			{
				strcpy_s(szField_tmp, "NULL");
			}
			else
			{
				strcpy_s(szField_tmp, (char*)((_bstr_t)Field_tmp));
			}
			
			// 가져온 값을 List control에 출력한다. 
			if(i==0)
				Index = m_ctrList.InsertItem(iCount, szField_tmp, 0);
			else
				m_ctrList.SetItemText(Index, i, szField_tmp);
		}

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


4. 컬럼 추가, 삭제 함수 구현


- 컬럼 추가 함수


void CDialog1::OnBnClickedBtnAttadd()
{
	// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
	CString str;
	UpdateData();

	if(m_ColumnIdx < 10)
	{
		GetDlgItemText(IDC_EDIT_ATT,_T(str));

		m_Adodb.m_pComm->CommandText = "ALTER TABLE dbo.student ADD " + (_bstr_t)str + " varchar(50) NULL";

		try
		{
			m_Adodb.m_pRs = m_Adodb.m_pComm->Execute(NULL,NULL, adCmdText);
		}
		catch (...)
		{
			MessageBox("Column 생성 오류!" , "ADO DB", MB_ICONSTOP);
			return;
		}

		//List Control에 생성된 컬럼 추가
		m_ctrList.InsertColumn(m_ColumnIdx,str, LVCFMT_LEFT, 50);
		strcpy_s(m_ColumnName[m_ColumnIdx++],str);
	}
	else
	{
		MessageBox("Column 생성 제한 10개!", "ADO DB", MB_ICONSTOP);
		return;
	}
}


- 컬럼 삭제 함수


void CDialog1::OnBnClickedBtnAttdel()
{
	// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
	CString str, str_cmp;

	//Column Name 획득을 위한 코드
	LVCOLUMN lvColInfo ;
	ZeroMemory(&lvColInfo, sizeof(lvColInfo));
	lvColInfo.cchTextMax = 100;
	lvColInfo.pszText = (LPSTR)(LPCTSTR)str_cmp;
	lvColInfo.mask = LVCF_TEXT;

	UpdateData();
	
	if(m_ColumnIdx > 0)
	{
		GetDlgItemText(IDC_EDIT_ATT,_T(str));

		m_Adodb.m_pComm->CommandText = "ALTER TABLE dbo.student DROP COLUMN " + (_bstr_t)str;

		try
		{
			m_Adodb.m_pRs = m_Adodb.m_pComm->Execute(NULL,NULL, adCmdText);
		}
		catch (...)
		{
			MessageBox("Column 삭제 오류!" , "ADO DB", MB_ICONSTOP);
			return;
		}

		//테이블에 컬럼명을 검색하여 해당 컬럼을 지우기
		for(int i=0; i < m_ColumnIdx; i++)
		{
			//GetColumn실행 후 str_cmp에 열(i)이 가리키는 컬럼명이 적용됨
			m_ctrList.GetColumn(i, &lvColInfo);
			
			//Edit Box에 있는 컬럼명과 검색된 컬럼명이 일치할 시 해당 컬럼 삭제
			if(strcmp(str_cmp, str)==0)
			{
				m_ctrList.DeleteColumn(i);
				m_ColumnName[i][0] = '\0';
				m_ColumnIdx--;
			}
		}
	}
	else
	{
		MessageBox("Column 없음!", "ADO DB", MB_ICONSTOP);
		return;
	}
}



* 테스트!


0


댓글