티스토리 뷰
목표 : 대화상자 기반으로 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
- MFC
- c++
- CMFCBUTTON
- 소켓
- 모달리스
- 해외송금확인
- 전자신고파일설명서
- 스티커메모로드중
- MSSQL
- 세금계산서합계표양식
- 법정동코드
- 청년내일채움공제
- 스쿠트항공 환불받기
- sqlite3
- 부가가치세전산매체
- MXCOMPONENT
- 프로세스이름변경
- MFC ADO
- ADO
- SendMessage
- 청년내일채움공제 만기신청
- MFC Modeless
- #자동업데이트
- 모달리스 다이얼로그
- Modeless
- 부가가치세
- 전자신고변환
- 항공알파벳
- Sticky Notes Loading
- ADODB
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
글 보관함