8 장데이터베이스 8.1 기본개념 - 데이터베이스 : 데이터를조직적으로구조화한집합 (cf. 엑셀파일 ) - 테이블 : 데이터의기록형식 (cf. 엑셀시트의첫줄 ) - 필드 : 같은종류의데이터 (cf. 엑셀시트의각칸 ) - 레코드 : 데이터내용 (cf. 엑셀시트의한줄 ) - DDL(Data Definition Language) : show, create, drop 등 - DML(Data Manipulation Language) : select, insert, update, delete 8.2 MySQL 을설치한다. (1) 다운로드 : http://dev.mysql.com/downloads/ (mysql-installer-community-5.7.22.1.msi) (2) Custom Setup : MySQL Server 5.7, MySQL Notifier 1.1, Connector/C 6.1 (3) 서버설정 : Instance=Developer, Port=3306, root password=rootpass, Windows Service Name=MySQL57 (4) 한글설정 : C:\ProgramData\MySQL\MySQL Server 5.7\my.ini 를수정한다. [mysql] default-character-set = euckr [mysqld] default-character-set = euckr (5) 시작 -> 제어판 -> 시스템및보안 -> 관리도구 -> 서비스 -> MySQL57 -> 수동 / 자동 (6) 시작 -> 모든프로그램 -> MySQL -> Server -> MySQL 5.7 Command Line Client (ANSI) Enter password : ********(rootpass) mysql> set sql_mode = ""; /* strict mode 를사용하지않는다. */ mysql> status; mysql> show variables like 'c%'; mysql> show databases; mysql> use mysql; mysql> show tables; mysql> select * from user; mysql> insert into user (host, user, authentication_string) values -> ('localhost','user1',password('pass01')); mysql> flush privileges; mysql> insert into db values ('localhost', 'db1', 'user1', 'Y','Y','Y','Y','Y' ->,'Y','Y','Y','Y','Y', 'Y','Y','Y','Y','Y', 'Y','Y','Y','Y'); mysql> select * from db; mysql> create database db1; mysql> exit - MySQL 명령프롬프트바로가기를바탕화면에복사한다. 속성에서대상을 -uroot => -uuser1 db1 으로변경한다.
Enter password : ******(pass01) mysql> set sql_mode = ""; mysql> use db1; mysql> status; mysql> create table member ( -> no int(5) auto_increment primary key, -> id char(12) not null, -> pw char(41), -> grade int(1) default 0 -> ); mysql> desc member; mysql> insert into member values (1, 'manager', password('1234'), 9); mysql> insert into member (id, pw) values (' 홍길동 ', password('1111')); mysql> update member set pw=password('2222') where id=' 홍길동 '; mysql> delete from member where id=' 홍길동 '; mysql> quit 8.3 새프로젝트를생성한다. (1) 프로젝트 : 이름 =Test, Type= 대화상자기반, 문자집합 = 멀티바이트 (2) 컨트롤배치 : NO: IDC_EDIT1 ID: IDC_EDIT2 PW: IDC_EDIT3 IDOK IDC_BUTTON1 IDC_BUTTON2 IDC_BUTTON3 IDC_BUTTON4 IDC_EDIT4 (3) 변수연결 : IDC_EDIT1(Read only)=cstring m_struserno, IDC_EDIT2=CString m_strusername, IDC_EDIT3(Password)=CString m_strpassword, IDOK(Caption= 로그인 / 로그아웃 ), IDC_BUTTON1(Caption= 회원가입 ), IDC_BUTTON2(Caption= 회원탈퇴 ), IDC_BUTTON3(Caption= 암호변경 ), IDC_BUTTON4(Caption= 회원명부 ) IDC_EDIT4(Multiline)=CString m_stredit (4) 이벤트핸들러함수생성 : IDC_BUTTON1=OnClickedInsert(), IDC_BUTTON2=OnClickedDelete(), IDC_BUTTON3=OnClickedUpdate(), IDC_BUTTON4=OnClickedSelect(), IDOK=OnClickedLogin() (5) Project 속성에아래사항을추가한다. Additional include directory = C:\Program Files (x86)\mysql\mysql Connector 6.1\include Additional library directory = C:\Program Files (x86)\mysql\mysql Connector 6.1\lib Additional library = libmysql.lib (6) libmysql.dll을소스파일이있는디렉토리에복사한다.
8.4 사용자데이터베이스를연결한다. // TestDlg.h #include <mysql.h> #include <errno.h> public: MYSQL m_mysql; bool CTestDlg::OnInitDialog() mysql_init(&m_mysql); MYSQL *conn = mysql_real_connect(&m_mysql, "localhost", "user1", "pass01", "db1", 3306, (char *)NULL, 0); if (conn == NULL) AfxMessageBox((LPCTSTR)mysql_error(&m_mysql)); ::PostQuitMessage(0); mysql_set_character_set(&m_mysql, "euckr"); return TRUE; void CTestDlg::DestroyWindow() mysql_close(&m_mysql); 8.5 전체레코드를읽는다. void CTestDlg::OnClickedSelect() int status = mysql_query(&m_mysql, _T("select * from member")); if (status!= 0) AfxMessageBox((LPCTSTR)mysql_error(&m_mysql)); return; MYSQL_RES *result = mysql_store_result(&m_mysql); if (result == NULL) AfxMessageBox(_T("Empty set")); return; int nfieldcount = mysql_num_fields(result); MYSQL_FIELD *fields = mysql_fetch_fields(result); MYSQL_ROW row; m_stredit = _T(""); while ((row = mysql_fetch_row(result)) for (int i=0; i<nfieldcount; i++) m_stredit.appendformat(_t("%s=%s "), fields[i].name, row[i]); m_stredit.appendformat(_t("\r\n")); mysql_free_result(result); this->updatedata(false); // 화면을갱신
8.6 새레코드를추가한다. void CTestDlg::OnClickedInsert() if (m_strusername.isempty()) AfxMessageBox(_T("id 를입력하시오.")); return; if (m_strpassword.isempty()) m_strpassword = _T(" "); // 빈칸은공백문자로대체한다. query.format(_t("insert into member (id,pw) values ('%s',password('%s'))"), m_strusername, m_strpassword); 8.7 레코드를삭제한다. void CTestDlg::OnClickedDelete() query.format(_t("delete from member where id='%s'"), m_strusername); 8.8 사용자암호를수정한다. void CTestDlg::OnClickedUpdate() query.format(_t("update member set pw=password('%s') where id='%s'"), m_strpassword, m_strusername);
8.9 로그인이성공하면버튼을로그아웃으로바꾼다. void CTestDlg::OnClickedLogin() if (m_strpassword.isempty()) m_strpassword = _T(" "); CString strlogin; this->getdlgitemtext(idok, strlogin); if (strlogin.c if (m_strpassword.isempty()) m_strpassword = _T(" "); CString strlogin; this->getdlgitemtext(idok, strlogin); if (!strlogin.compare(_t(" 로그인 "))) query.format(_t("select * from member where id='%s' and pw=password('%s')"), m_strusername, m_strpassword); MYSQL_RES *result = mysql_store_result(&m_mysql); int nrowcount = mysql_num_rows(result); if (nrowcount == 0) AfxMessageBox(_T("ID or PW is incorrect.")); else MYSQL_ROW row = mysql_fetch_row(result); m_nuserno = atoi(row[0]); m_strpassword = _T(""); this->updatedata(false); this->setdlgitemtext(idok, _T(" 로그아웃 ")); else this->setdlgitemtext(idok, _T(" 로그인 "));