티스토리 뷰
목표 : 대화상자 기반으로 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
'Programming > MFC(C++)' 카테고리의 다른 글
[MFC] 대화상자 최소화,최대화,종료 버튼 클릭시 이벤트 핸들링 (1) | 2018.07.06 |
---|---|
[MFC] SQLITE3 연동하기 (db 생성) (0) | 2018.07.05 |
[MFC] 대화상자 기반 ADO 사용하기 - 3 (0) | 2018.07.04 |
[MFC] 컨트롤 캡션 개행 방법 (0) | 2018.07.04 |
[MFC] 다이얼로그 Style 속성 (Overlapped, Popup, Child) 차이 (0) | 2018.07.03 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- Sticky Notes Loading
- 전자신고변환
- 스쿠트항공 환불받기
- MSSQL
- #자동업데이트
- 부가가치세전산매체
- 해외송금확인
- 프로세스이름변경
- SendMessage
- ADO
- 항공알파벳
- 전자신고파일설명서
- 스티커메모로드중
- Modeless
- MFC Modeless
- 모달리스 다이얼로그
- MFC
- CMFCBUTTON
- 소켓
- 세금계산서합계표양식
- sqlite3
- c++
- 청년내일채움공제 만기신청
- MFC ADO
- 법정동코드
- ADODB
- 부가가치세
- 모달리스
- MXCOMPONENT
- 청년내일채움공제
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |
글 보관함