키스맥 - 리얼베이직 매킨토시 전문 웹 매거진 웹진

  + 파일메이커 기초편
  + 4th Dimension
  + 리얼베이직
  + OS X 10.3
  + 홈페이지 만들기
  + 포토샵 강좌
  + 디카 완전정복
  + 실무로 배우는 Quark
  + MLayout
  + iPod 강좌
  + html 강좌
  + 간단매뉴얼&팁
  + 5세대 iPod 강좌
  + iTunes 한 컷 강좌
  + iPod 한컷강좌
            


18회. Database -2-


지난 강좌에서는 데이타베이스와 리얼베이직에서의 데이타베이스에 대한 기본 내용, 그리고 SQL 문의 기초에 대해서 공부를 했었습니다. 이번 강좌에서는 지난 강좌에 이어서 리얼베이직에서의 실질적인 데이타베이스 사용에 관한 내용을 공부해보도록 하겠습니다. 리얼베이직 데이타베이스 시스템을 기반으로하여 데이타베이스 파일을 생성하는 방법과 데이타의 입력, 검색, 삭제, 수정등에 대해서 실질적인 부분을 해보도록 하겠습니다. 이번 강좌에서는 지난 강좌에 비해서는 좀 더 실질적인 내용을 다룰 것이고 예제를 통해서도 연습을 할 수 있을 것이기 때문에 글만 많아서 좀 지루했었을지도 모르는 지난 강좌보다는 좀 더 역동적(?)이 되지 않을까 하는 생각이 듭니다..^^;;
자 그럼 데이타베이스의 2번째 내용을 시작해 볼까요?

이전 강좌에서 리얼베이직의 데이타베이스에 대해서 알아보았습니다. 그 내용들 잊지 말고 잘 익두시기 바랍니다. 그럼 이번에는 리얼베이직에서 실질적으로 어떻게 데이타베이스 파일을 생성하는지 확인해 보도록 하겠습니다. 리얼베이직에서는 데이타베이스를 이용하기 위해서는 반드시 Database 를 등록하거나 Database 클래스를 이용하여 객체화 해서 사용해야 합니다. 이러한 방법으로는 2가지가 있는데 한가지는 리얼베이직의 메뉴를 통해 Database 를 등록하는 방법이며 또 한가지는 코드를 통해 객체화시켜서 사용하는 방법입니다. 결과적으로는 똑같은 역할을 하지만 방법과 용도 면에서 조금 차이가 있습니다. 필자 같은 경우는 후자의 방법인 코드로 작성하는 방법을 100% 사용합니다. 그럼 각각의 방법을 통해서 Database 를 등록하는 방법을 알아보도록 하겠습니다.

1) 리얼베이직의 메뉴를 통해서 Database 등록하기.
리얼베이직의 File 메뉴를 보면 하단 부분에 "Add Data Source" 라는 항목이 있습니다. 이를 통해서 리얼베이직에서 제공이 되는 데이타베이스를 등록할 수 있습니다. 항목들을 보면 현재 리얼베이직에서 제공이 되는 데이타베이스 시스템들을 확인할 수도 있죠.(참고로 리얼베이직의 데이타베이스 지원은 Plugin 방식을 통해 지원이 됩니다.)

예전 3.x 대 버젼에서는 리얼베이직 프로그램 자체에 Database 시스템 지원을 위한 기능이 내장되어있었지만 4.x 대에 이르러서 플러그인 형태로 제공이 되어 쉽게 업그레이드 또는 설치 및 제거가 가능토록 되었습니다.

Add Data Source는 별도의 계층 메뉴로 되어있어서 현재 지원되는 데이타베이스 시스템을 바로 확인이 가능합니다. 첫번째 항목은 새로운 RealDatabase 를 생성할 때 사용되는 "New REAL Database..." 메뉴이며 두번째는 이미 만들어진 RealDatabase 파일을 불어들일 때 사용되는 "Select REAL Database..." 메뉴입니다. 나머지는 다른 데이타베이스 시스템을 연결할 때 사용되는 메뉴들입니다. 메뉴 이름들만 보면 아~! 어떤 데이타베이스 시스템에 사용되는구나를 쉽게 알 수 있을 것입니다. 그럼 RealDatabase 파일을 메뉴를 통해서 한번 만들어 보도록 하겠습니다. 위의 내용 처럼 File 메뉴의 "Add Data Source" 메뉴에서 "New Real Database" 메뉴를 선택합니다.

"New REAL Database..." 메뉴를 선택하면 이제는 새로운 데이타베이스 파일을 어디에 저장할 것인지 물어보는 Dialog 윈도우가 나타나게 됩니다. 그리고 이 Dialog 윈도우 화면에서 저장할 데이타베이스 파일명을 임의로 적을 수 있습니다. 그럼 데이타베이스 파일명을 kissmacDB 라고 적고 데스크탑 폴더에 저장을 해보도록 합니다.
그럼 이제 데스크탑을 확인해 봅니다. 데스크탑에 "kissmacDB" 라는 이름으로 금방 생성된 Real Database 파일을 확인할 수 있을 것입니다. 그리고 이렇게 생성되어 추가된 Database 파일은 프로젝트 윈도우에 자동으로 등록이 되게 됩니다. 프로젝트 윈도우에서도 다음 그림처럼 확인을 할 수 있습니다.

위와 같이 하면 RealDatabase 타입의 데이타베이스 파일이 추가된 것입니다. 이걸로 모든 것이 끝난 것이 아니라 이제 시작입니다. 껍데기만 있고 실질적인 데이타베이스 설계는 하나도 이루어진 것이 없는 셈이죠. 그럼 이제 프로젝트 윈도우에서 kissmacDB 를 더블클릭해 봅니다. 그럼 데이타베이스 파일의 내용을 볼 수 있고 Table 을 생성하고 그 Table 내의 Field 들을 생성 또는 수정, 삭제 할 수 있는 Database 편집 윈도우가 나타나게 됩니다. 처음에는 생성된 내용이 없기 때문에 빈 윈도우로 나타날 것 입니다.

위의 그림에서도 볼 수 있듯이 아직 생성한 Table이 없기 때문에 왼쪽의 리스트 내용에는 아무것도 없고 단지 오른쪽에 "New Talbe" 버튼만 활성화 되어있는 것을 확인할 수 있습니다. 그럼 "New Table"버튼을 눌러봅니다. Table 은 데이타베이스 파일에서 가장 근본이 되는 데이타공간이기 때문에 우선 Table 을 만들어줘야 그 안에 실질적인 데이타가 들어가는 Field 를 설계할 수 있습니다. 다음은 버튼에 대한 간단한 설명입니다.

- View Data : 이 버튼은 TABLE 내에 데이타가 들어가 있을 경우 SQL 문을 직접 입력하여 데이타를 검색할 수 있는 별도의 윈도우가 나타나게 됩니다. 데이타를 검색할 때에는 이 버튼을 사용하면 됩니다. 기본적으로는 비활성화 되어있으면 추가된 Table 을 선택하면 활성화 됩니다.
- Edit Schema : 테이블 설계를 변경할 때 사용됩니다. New Table 과 같은 화면이 나타납니다. 기본적으로는 비활성화 되어있으면 추가된 Table 을 선택하면 활성화 됩니다.
- New Table : Table 을 새로 생성할 때 사용됩니다. 테이블은 하나 외에도 여러개의 테이블을 추가할 수 있기 때문에 새로운 신규 테이블 생성시에는 항상 사용됩니다. 항상 활성화 되어있습니다.
- Drop Table : 이미 만들어진 Table 을 삭제할 때 사용됩니다. Table 내에 데이타가 있을 경우에는 그 데이타까지 모두 삭제되게 됩니다. 기본적으로는 비활성화 되어있으면 추가된 Table 을 선택하면 활성화 됩니다.

"New Table" 버튼을 누르면 Table 이름을 넣고 그 안의 Field 항목을 넣을 수 있는 Table 편집 윈도우가 나타나게 됩니다. 그럼 우선 이 Table 편집 윈도우에 대해서 설명을 하도록 하겠습니다. 다음 그림을 참조해주세요...

위의 그림에서 보면 상단 부분에는 Table 의 이름을 넣을 수 있는 "Table Name" 필드가 있습니다. 이곳에는 이름 그대로 Table 의 이름을 넣으면 됩니다. Table 의 이름을 적을 때에는 영문으로만 작성을 하셔야 하고 띄어쓰기 등은 하면 안되며 *, (, - 등의 특수문자는 쓰지 않는 것이 좋습니다. 보통 띄어쓰기를 하려고 하면 "_"(언더바)를 사용하는 경우는 있습니다.

왼쪽 하단의 Field Name 필드에는 Table 내에 생성이 되는 Field 의 이름을 적는 곳입니다. 그리고 Field Type 은 Table 내에 생성이 되는 각각의 Field 타입을 지정하는 곳입니다. FieldType 은 Popup 메뉴를 통해서 기본 타입을 손쉽게 입력할 수 있도록 되어있습니다. 물론 미리 타입을 알고 있다면 그 타입을 직접 타이핑해서 넣어도 됩니다.

Table Name 필드에는 해당 Table 이름을 적어 넣으면 됩니다. 여러개의 테이블이 만들어질 경우는 중복되어서는 안됩니다. 그리고 Field Name 부분에는 Table 내에 들어갈 필드명을 적어 넣으면 되는데 이때 이름을 넣고 Field Type 을 지정하면 왼쪽 하단의 "Create" 버튼이 활성화 됩니다. 그리고 Create 버튼을 누르면 해당 필드가 추가됩니다. 당연히 Field 이름들도 중복되어서는 안됩니다.

추가된필드는 Table 편집 윈도우의 상단 리스트에 나타나게 되고 이름과 타입을 확인할 수 있습니다.
이때 추가된 필드를 선택하면 오른쪽 하단의 "Option" 버튼이 활성화 됩니다. 이것은 무엇일까요? 우선 Option 버튼을 눌러 봅니다. 그럼 "Unique(Primary Key)" 라는 항목과 Mandatory(Not Null) 이라는 체크박스 항목이 2개 있을 것입니다. 이것을 무엇을 말할까요? 이에 대해서 우선 알아보도록 하겠습니다.

- Primary Key 와 Not null
Primary Key 라는 것은 중복되지 않는 고유의 값을 나타냅니다. 데이타베이스에 들어가는 데이타들은 고유의 값을 포함하고 있어야 하는 경우가 많습니다. 예를 들어보도록 하죠. 주소록 프로그램을 만든다고 생각을 할때 각각의 주소 정보를 넣는다고 생각해 봅니다. 주소록에는 이름이 똑같은 경우가 생기겠죠? 그래서 이름으로는 누가 누구인지 정확하게 구분하기가 어려울 경우가 많습니다. 전화번호는 다르겠지만 전화번호는 수시로 변경될 수 있기 때문에 이걸로도 정확하게 구분하기가 어려운 경우가 있습니다. 가장 대표적인 경우는 주민등록 번호겠죠? 주민등록 번호는 똑같은 사람이 없기 때문이죠. 이러한 고유의 값을 갖는 필드를 Primary Key 로 지정을 하면 내용의 중복으로 인해서 문제가 될 만한 소지를 없애겠다는 것이죠. 그리고 고유한 값을 지정하지 않을 경우에는 데이타를 입력하는데에는 문제가 없지만 수정이나, 삭제 등을 할 때에는 문제가 됩니다. 예를 들어서 "미쉐린" 이라는 이름을 갖는 데이타를 삭제한다고 할 경우 이 이름만으로 데이타를 비교하여(비교 및 조건은 SQL 문에서 항상 Where 을 이용합니다.) 삭제한다고 하면 동명이인일 경우에는 원하지는 않는 데이타가 삭제될 수도 있습니다. 따라서 이러한 문제점을 해결하기 위해서 사용되는 것이 고유값을 갖는 필드이며 이는 증가되는 숫자가 많이 사용됩니다. 예를 들어서 주소록에서 주민등록 번호를 사용한다 하더라도 주변 사람들의 주민등록 번호를 받기도 어려울 뿐 아니라 잘못 적어서 다시 고칠 경우는 다른 사람과 중복되는 경우가 생기기 때문입니다. 이렇게 중복이 되지 않고 고유의 키로 사용되는 필드를 Primary Key 로 지정을 하고 절대 고유키로 사용을 하는 것입니다. Primary Key 로 사용되는 필드는 중복이 안됩니다. 하지만 Primary Key 로 여러개의 필드를 지정할 수 있기 때문에 이럴 경우에는 모든 Primary Key 지정된 필드값이 갖지 않고 한두개만 같다고 하면 이때에는 가능 합니다. Primary Key 에 대해서는 실질적으로 테이블을 만들고 예제를 할때에 다시 한번 공부를 하도록 하죠.

그럼 이제 Not Null 에 대해서 알아보도록 하겠습니다. Not Null 을 말 그대로 필드의 내용이 비어있어서는 안된다는 것입니다. Not Null 로 지정된 필드에 내용을 입력하지 않고 데이타를 추가하려고 하면 에러가 발생됩니다. 따라서 Not Null 로 지정된 필드는 항상 데이타가 입력이 되어야 합니다. 예를 들어서 주소록의 경우 이름 필드를 Not Null 로 지정을 하게 되면 항상 이름을 입력해야합니다. 하지만 전화번호나 주소는 모를 경우 입력을 못하는 경우도 있기 때문에 다른 내용들은 Not Null 로 지정을 하면 안됩니다. 아무곳이나 Not Null 을 지정해야하는 경우 해당된 모든 데이타가 입력이 되어야만 데이타가 입력이 되기 때문에 꼭 필요한 부분에만 Not Null 을 지정해야합니다. 참고로 Primary Key 는 중복이 되지 않는 고유의 값이 항상 들어가야 하는 부분이기 때문에 Primary Key 로 지정이 되는 필드는 항상 Not Null 로 지정이 되어야 합니다.

그럼 이제는 Table 편집 윈도우에서 필드를 추가해서 테이블을 설계해보도록 하겠습니다. 예는 주소록 생성으로 하도록 하죠. 그럼 앞서 보았던 Table 편지 윈도우에서 Table Name 필드에는 "AddressList" 라고 입력을 합니다. 그리고 다음과 같은 필드를 적절한 타입을 지정하여 각각 입력을 합니다.
File Name
Type
Option
설명
Name
varchar
Not Null
이름
CelPhoneNum
varchar
해드번전화번호
HomePhoneNum
varchar
집전화번호
Address
varchar
주소
UID
varchar
Primary Key Not Null
전화번호 정보의 고유 값
위의 내용은 일반적으로 생각해볼 수 있는 주소록 프로그램을 설계할 때 사용되는 필드 내용입니다.
Field Name 부분은 그냥보면 알 수 있듯이 이름, 핸디폰, 집전화번호, 주소 등으로 구성을 했습니다.
이름은 항상 입력 되도록 하기 위해서 Not Null 로 필드타입을 지정했습니다. 그리고 마지막을 보면 UID 라는 부분이 있습니다. 이는 증가되는 숫자를 넣기 위함이고 중복되지 않는 숫자가 들어가게 하기 위해서 Primary Key 로 지정을 하고 Not Null 로 지정을 하였습니다. 주소록이나 데이타의 입력시에는 항상 이런 고유 값을 별도로 넣어서 고유값으로 사용하는 것이 제일 일반적인 설계 방법 중 하나입니다.

다음은 위의 내용을 이용하여 Table 설계를 한 Table 편집 윈도우의 화면입니다.

위와 같이 테이블을 설계하고 나서 "OK" 버튼을 누르게 되면 Table 편집 윈도우는 닫히게 되고 Table 리스트 화면에는 다음 그림과 같이 추가된 테이블이 화면에 나타나게 됩니다.
여기까지가 파일 메뉴를 이용해서 데이타베이스의 Table 을 설계하는 부분입니다. 그럼 이제는 직접 Code 를 작성하여 Table 을 만드는 방법에 대해서 알아보도록 하겠습니다.

2) 코드로 작성하여 Database 설계하기...
그럼 이제는 직접 코드를 작성하여 데이타베이스파일과 그 안에 Table 을 설계해보도록 하겠습니다.
리얼베이직의 메뉴에서 할 수 있는 기능 들의 대부분은 직접 코드를 작성하여 구현할 수 있다라는 것을 항상 생각하시기 바랍니다.(필자는 코드로 작성할 수 있는 내용은 그때그때 수정이 가능하고 클래스화하여 손쉽게 다른 프로그램에서도 적용시킬 수 있기 때문에 항상 코드로 작성하는 것을 추천합니다.)

그럼 앞서 했던 프로젝트를 기반으로 코드로 데이타베이스 파일을 만드는 연습을 해보도록 하겠습니다. 먼저 기본적으로 생성되어있는 Window1을 열어서 그 안에 PushButton 콘트롤을 중앙에 드래그 해서 놓습니다. 그리고 Caption 속성을 "Create DB"로 하고 적절하게 가로 길이를 조절합니다.

화면 구성은 간단합니다. 이제 이런 버튼 만드는 것은 아주아주 간단한 일일 것입니다. 그리고 PushButton 을 더블클릭 한다음 다음과 같은 코드를 작성합니다.
dim DB as REALDatabase
dim SQL as String
dim f as FolderItem

f = DesktopFolder.child("kissmacDBCode")

DB = New REALDatabase

DB.DatabaseFile = f

if DB.CreateDatabaseFile = false then
1111111msgbox "데이타베이스 생성 에러"
1111111return
end if

SQL = "Create Table AddressList("
SQL = SQL+"Name varchar Not null, "
SQL = SQL+"CellPhoneNum varchar, "
SQL = SQL+"HomePhoneNum varchar, "
SQL = SQL+"Address varchar, "
SQL = SQL+"UID Integer not null, "
SQL = SQL+"Primary Key(UID))"

DB.SQLExecute(SQL)
if DB.Error then
1111111MsgBox DB.ErrorMessage
1111111return
end if

DB.Close

위의 코드는 아까 생성한 Table 을 똑같이 만들어주는 역할을 합니다. 그럼 분석을 해보도록 하겠습니다. 첫번째 dim 선언 부는 DB 라는 RealDatabase 타입의 변수(객체)를 선언해주었습니다. 이제 이를 통해서 데이타베이스 파일을 생성하고 Table 을 설계할 것이기 때문입니다. 문자형인 String 타입의 SQL 문자형 변수는 SQL 문을 쉽게 입력하고 대입하기 위해서 사용됩니다. FolderItem 변수(객체) f 는 실질적인 데이타베이스 파일이 저장되는 부분을 알려주는 역할을 합니다.

이제 먼저 데이타베이스 파일을 생성해 주기 위해서 파일이 저장될 위치와 데이타 파일명을 정해줘야합니다. 그 부분은 FolderItem 변수(객체) f 를 통해 이루어 지고 다음 코드에서 실행이 됩니다.

f = DesktopFolder.child("kissmacDBCode")
여기에서 파일메뉴를 통해서 만든것과 동일하게 데스크탑 위치에 파일을 생성하도록 DesktopFolder 함수를 이용했습니다. 파일명은 중복될 수 있기 때문에 구분을 위해서 "kissmacDBCode"라고 지정을 하였습니다.
여기까지 한다고 해서 실질적인 데이타베이스 파일이 생성되는 것은 아닙니다.
다음 코드에서는 RealDatabase 클래스 타입의 변수(객체) DB 를 New 함수를 통해서 초기화를 시켜주게 되죠.
DB = New REALDatabase
그리고 RealDatabase 의 속성중 DatabaseFile 에 처음에 작성했던 파일 생성 코드를 통해 데이타파일의 저장위치를 갖고 있는 f 를 대입시킵니다.(Database Class의 속성에 대해서는 이전 강좌(Database 1편)를 참조해 주세요.)
DB.DatabaseFile = f
그리고 RealDatabase Class 의 CreateDatabaseFile 함수를 통해서 실질적인 데이타가 저장되는 데이타베이스 파일을 생성해 줍니다. 여기에서 데이타파일을 생성하는데 에러가 발생하면 MsgBox 함수를 통해서 알려주도록 코드를 작성했습니다. 같은 파일명이 있다면 에러가 발생할 수도 있습니다.
if DB.CreateDatabaseFile = false then
1111111msgbox "데이타베이스 생성 에러"
1111111return
end if
여기까지 코드가 진행이 되면 데스크탑에 "kissmacDBCode" 파일이 생성이 되게 됩니다. 하지만 데이타가 저장될 수 있는 공간만 마련이 되어있을 뿐 실질적인 데이타는 들어갈 수 없게 되어있죠. 이제 Table 을 설계해서 데이타가 들어갈 수 있는 자리를 마련해줘야 데이타를 넣을 수 있습니다. Table 의 설계와 생성은 그 다음 코드인 SQL 문에서 확인할 수 있습니다. 이전 강좌에서 Table 을 새로 생성할 경우에는 Create 명령어를 사용한다고 했었죠. 다음의 코드에서 Create 명령어를 이용하서 Table 을 설계하는 SQL 문을 확인할 수 있습니다.
SQL = "Create Table AddressList("
SQL = SQL+"Name varchar Not null, "
SQL = SQL+"CellPhoneNum varchar, "
SQL = SQL+"HomePhoneNum varchar, "
SQL = SQL+"Address varchar, "
SQL = SQL+"UID Integer not null, "
SQL = SQL+"Primary Key(UID))"
위의 코드를 순서대로 보면 먼저 이전에 배웠던 것 처럼 Create 명령어가 오고 Table 이름이 뒤에 오게 됩니다. 그리고 괄호 안에 Field 명과 타입이 오고 Not Null 일경우는 타입 뒤에 Not Null 이라고 설정을 해주게 됩니다. Primary Key 의 설정은 Field 를 모두 설정한 다음 맨 뒷 부분에 지정을 해주고 별도로 필드명만 적어서 Primary Key 필드를 지정하게 되어있습니다. 처음 파일을 통해서 데이타베이스 파일을 만들었을 때와 동일한 내용으로 설계를 해서 만들었으며 마지막의 UID부분을 Primary Key 로 지정하였습니다. Name 필드는 Not null 로 지정을 했습니다.

마지막으로 작성한 SQL 문을 이용하여 RealDatabase 클래스의 SQLExecute 함수를 이용하여 SQL 문을 실행하게 됩니다. 위의 SQL 문이 실행되면 kissmacDBCode 데이타베이스 파일 내에 새로운 Table 인 "AddressList" 테이블이 생성되게 됩니다. 그리고 마지막 코드 부분에는 Table 을 생성시 에러가 있을 경우 에러메세지를 알려주도록 코드를 작성했습니다.(항상 에러를 체크할 수 있는 부분이 있다면 에러코드를 작성하는 것이 나중에 프로그램을 수정하거나 버그를 수정할 때 굉장히 편리하게 됩니다.)
어떤 경우는 에러체크를 위해서 작성하는 코드가 실질적인 기능 코드보다도 많아지는 경우도 있습니다. 하지만 그런 경우에 좀 지겹고 귀찮더라도 잘 해놓지 않으면 수천라인, 수만 라인이 작성되는 큰 프로그램을 만들 때 버그를 수정하기가 어렵게 됩니다. 따라서 나중에 위해 항상 에러를 체크할 수 있는 코드를 작성하는 습관을 들이도록 하시기 바랍니다.
DB.SQLExecute(SQL)
if DB.Error then
111111MsgBox DB.ErrorMessage
111111return
end if

DB.Close
마지막의 DB.Close 라는 코드는 DB 변수(객체)를 종료해주는 역할을 합니다. 물론 이런경우에는 해주지 않아도 되는 부분이지만 정확한 코드 작성을 위해서는 항상 Open 과 Close 를 명확하게 하는 습관을 들이는 것이 좋습니다.

여기까지가 코드를 이용해서 데이타를 만드는 내용이었습니다. 이제 프로그램을 실행해서 버튼을 눌러보시기 바랍니다. 그러면 데스크탑에 "kissmacDBCode" 라는 데이타 베이스 파일이 생성되는 것을 확인할 수 있을 것 입니다. 그럼 이제는 제대로 Table 이 만들어졌는지 내용을 확인해야겠죠? File 메뉴의 Add Data Source 메뉴에서 Select Real Database... 항목을 선택해서 데스크탑에 새로 생성된 KissmacDBCode 파일을 불러오거나 직접 그 파일을 데스크탑에서 드래그 하여 리얼베이직의 프로젝트 윈도우에 드래그 해보시기 바랍니다.


이제 위의 화면에서 보시는 바와같이 프로젝트 윈도우에 새로 추가된 kissmacDBCode 데이타베이스 파일을 확인할 수 있을 것입니다. 그럼 이제 kissmacDB 와 kissmacDBCode 파일을 더블클릭하여 생성된 Table 이 서로 같은지 확인해 보시면 됩니다. 다르다구요? 그럼 잘못 작성한 것이겠죠..^^;; 그럼 다음에는 데이타베이스 내에 데이타를 입력하는 것을 해보도록 하죠.

그럼 이제 위에 만들어본 Database 파일에 데이타를 입력해보도록 하겠습니다. 데이타베이스에 데이타를 입력하는 방법에는 이전 강좌에서 DatabaseRecord 클래스를 사용하는 방법과 SQL 문의 Insert 명령어를 사용하는 방법 2가지가 있다고 하였습니다. Insert 문으로 입력하는 것에 대해서는 간단하게나마 SQL 에 대한 문법을 설명할 때 잠시 맛볼 수 있었습니다. 이번에는 이 2가지 방법을 모두 사용하여 데이타를 입력해보도록 하겠습니다. 어떤 방법을 사용해도 되며 본인이 편한 방법을 선택해서 사용하면 될 것입니다. 참고로 필자는 2가지 병행해서 사용하며 주로 DatabaseRecord 클래스를 사용합니다.

그럼 지난 강좌에서는 SQL 문의 Insert 에 대해서 알아보았으니 이번에는 DatabaseRecord 클래스에 대해서 먼저 알아보도록 하겠습니다. 데이타베이스에서 데이타를 입력해주는 DatabaseRecord 클래스의 함수에 대해서 알아보도록 하죠.(참고로 DatabaseRecord 클래스는 RealDatabase 에서 뿐만 아니라 Oracle, MySQL 등 모든 데이타베이스 시스템에서 데이타를 입력할 때 사용할 수 있습니다.)

해당 타입에 따라 모든 함수가 사용가능 한 것은 아니지만 Column 이나 IntegerColumn 등 해당 필드 타입이 적용되는 데이타베이스 시스템에서는 해당 함수가 그대로 사용됩니다.

1) DatabaseRecord Class 의 함수.
DatabaseRecord 클래스는 속성이 없습니다. 모두 함수로 되어있습니다. 각 함수는 입력되는 데이타의 타입에 따라서 구분이 되며 각각의 필드명을 인수로 사용합니다. 그럼 각각의 함수에 대해서 알아보도록 하죠.

- 함수의 종류
*BlobColumn : BlobColumn 함수는 Binary 데이타를 입력할 때 사용됩니다. 순수 Binary 데이타를 입력할 때 사용하시면 됩니다.
*BooleanColumn : 참과 거짓을 나타내는 Boolean 형의 데이타를 입력할 때 사용됩니다. CheckBox 콘트롤 등의 내용을 손쉽게 데이타베이스에 입력할 수 있습니다.
*Column : 문자형인 String 형의 데이타를 입력할 때 사용됩니다. 일반적으로 가장 많이 사용되는 함수입니다. MySQL 같은 경우는 문자형이라 하더라도 각 사이즈에 따라서 여러가지 필드타입이 있습니다. 사이즈에 따라서 다른 필드라 하더라도 리얼베이직에서 데이타를 입력 할때에는 Column 함수 한가지만을 이용해서 데이타를 입력하면 됩니다. 대신 입력되는 데이타는 그 해당 필드의 데이타 사이즈를 벗어나면 안되면 그 이내의 크기여야 합니다.
*DateColumn : 날짜를 나타내는 Date 타입의 변수(객체) 내용을 입력할 때 사용됩니다. RealDatabase 시스템 뿐 아니라 대부분의 데이타베이스 시스템에도 Date 형으로 필드타입을 지정할 수 있습니다. DateColumn 함수를 이용하면 손쉽게 Date 객체의 내용을 입력할 수 있습니다. 하지만 Date 타입의 필드에 SQL 문을 이용해서 넣을 경우는 "2000-5-30 18:00:00" 식으로 별도의 시간 포맷을 이용하여 데이타를 입력해야만 합니다. 실질적으로 날짜 정보를 입력해야하는 필드는 문자형의 필드로 구성되어있는 경우가 많기 때문에 Date 타입을 많이 사용하지는 않습니다.
*DoubleColumn : 실수 데이타를 입력할 때 사용됩니다.
*IntegerColumn : 정수 데이타를 입력할 때 사용됩니다. MySQL 같은 경우는 TinyInt, MediumInt, BigInt 등의 여러가지 정수형 타입이 있습니다. 이럴 경우에는 그냥 IntegerColumn 함수 한가지만을 입력하면 됩니다. 대신 데이타의 사이즈를 해당 필드 타입의 크기 이내에 해당되는 사이즈여야 합니다.
*JPEGColumn : JPEG 그림을 데이타베이스에 입력하는 방법은 여러가지가 있습니다. JPEG 그림 데이타를 Base64(EncodeBase64 함수 참조) 코드로 변환하여 Column 함수를 이용하여 문자형으로 데이타를 입력하는 방법도 있고 MBS 플러그인을 사용하여 PictureToString 함수를 이용하여 변환하는 방법이 있습니다. 하지만 JPEGColumn 함수를 이용하면 바로 JPEG 그림 데이타를 RealDatabase 파일에 그림 데이타를 입력할 수 있습니다. RealDatabse 시스템에서만 사용되는 함수이지만 RealBasic 5.5에서 입력시에는 별도의 데이타 변환없이 그림 데이타를 입력시에 에러발생이 많기 때문에 많이 사용되지는 않는 함수입니다.
*MacPICTColumn : JPEGColumn 함수와 마찬가지의 역할을 해주며 기존 MacOS 9의 기본 그림 포맷인 PICT 포맷을 그림 데이타를 입력할 때 사용됩니다. 이것도 거의 사용되지는 않으며 주로 그림 데이타를 문자형으로 변환을 해서 Column 함수를 이용하여 넣는 경우가 대부분입니다.

- DatabaseRecord Class 의 사용
DatabaseRecord 클래스를 사용하기 위해서는 우선 먼저 DatabaseRecord 클래스 타입의 변수(객체)를 초기화 해야합니다.
그럼 다음의 코드를 한번 보도록 하죠.
dim rec as DatabaseRecord

.
.
.


rec = New DatabaseRecord

rec.Column("Name") = "미쉐린"

.
.
.

DB.InsertRecord("AddressList", rec)

위의 코드는 DatabaseRecord 클래스 사용의 간단한 예를 보여드린 것 입니다. 그럼 처음 부분을 보도록 하죠. 첫번째 줄에는 rec 라는 이름의 DatabaseRecord 타입의 변수(객체)를 선언해주고 이후에 New DatabaseRecord 라는 내용을 통해 초기화(실질적인 객체를 생성)를 해 주었습니다. 그 이후에 DatabaseRecord 변수(객체)인 rec의 Column 함수를 통해서 "Name" 필드에 "미쉐린"이라는 이름을 넣은 것입니다. 앞서 설명에서 처럼 DatabaseRecord 클래스의 함수들은 필드명을 인수로 사용한다고 하였기 때문에 항상 Column 이나 IntegerColumn 등의 함수 뒤에는 필드명이 와야 합니다. 그럼 해당 필드에 입력한 데이타가 입력이 되게 됩니다. 그리고 실질적으로 데이타를 기록하기 위해서 Database 클래스의 InsertRecord 함수를 이용하여 데이타를 기록합니다. Database 클래스의 InsertRecord 함수는 순서대로 Table 명과 DatabaseRecord 클래스의 변수(객체)를 인수로 사용합니다. 따라서 DB.InsertRecord("AddressList", rec) 식으로 표현을 하게 되는 것입니다.

대충 DatabaseRecord 클래스의 사용 문법에 대해서는 이해가 가시는지요. 그럼 앞서 설계를 했었던 kissmacDB 주소 데이타베이스 파일에 데이타를 입력하는 예제를 통해서 좀 더 내용을 확인해 보도록 하겠습니다.

2) RealDatabase 에 데이타 입력하기
입력하는 방법은 앞서 언급했던 것처럼 DatabaseRecord 클래스와 SQL 문을 이용하여 2가지 방법으로 데이타를 입력해보도록 하겠습니다. 이제 데이타 입력을 위해 바로 이전에 했었던 프로젝트를 이용하여 화면 인터페이스를 좀 더 추가를 해보도록 하겠습니다. 처음 만들었던 CreateDB 버튼 밑에 새로운 버튼을 만들고 Caption 속성을 "Insert Data1" 이라고 지정합니다. 그리고 ActionButton 에 다음과 같은 코드를 입력합니다.
dim DB as REALDatabase
dim rec as DatabaseRecord
dim f as FolderItem


f = DesktopFolder.child("kissmacDB")

DB = New REALDatabase
DB.DatabaseFile = f

if DB.Connect= false then
111111MsgBox "데이타베이스 파일 오픈시 에러~!"
111111return
end if

rec = new DatabaseRecord

rec.Column("Name") = "kissmac"
rec.Column("CellPhoneNum") = "010-7777-7777"
rec.Column("HomePhoneNum") = "02-777-7777"
rec.Column("Address") = "Seoul, Korea"
rec.IntegerColumn("UID") = 0


DB.InsertRecord("AddressList", rec)
if DB.Error then
111111MsgBox DB.ErrorMessage
111111return
end if

DB.Close
위의 코드에서 보면 처음에 초기화 하는 부분은 Table 을 생성할 때와 비슷합니다.
대신 RealDatabase 클래스의 CreateDatabase 함수를 사용한 것이 아니라 기존에 있는 데이타베이스 파일을 오픈하기 위해서 DatabaseFile 속성에 해당 FolderItem 타입의 변수(객체)를 이용하여 데이타베이스 파일을 입력해 줍니다.
그리고 참과 거짓 값을 리턴해주는 Connect 함수를 이용하여 데이타베이스 파일에 접속을 하게 됩니다.
이 Connect 함수가 거짓 값인 False 를 리턴하게 되면 제대로 데이타베이스 파일을 오픈하지 못한 것이기 때문에 에러가 발생하도록 코드를 작성했습니다.
처음 초기화 코드 부분은 다음과 같습니다.
f = DesktopFolder.child("kissmacDB")

DB = New REALDatabase
DB.DatabaseFile = f

if DB.Connect= false then
111111MsgBox "데이타베이스 파일 오픈시 에러~!"
111111return
end if

여기까지 데이타베이스 파일을 오픈하는 부분이고 오픈이 되면 그 다음은 DatabaseRecord 클래스를 이용하여 데이타를 입력하는 코드를 작성하게 됩니다. 위의 코드에서 내용은 앞서 만들었던 AddresList 테이블의 Field 명에 각각의 데이타를 입력한 내용입니다.

마지막 부분에는 RealDatabase 클래스의 InsertRecord 함수를 통해서 DatabaseRecord 클래스 변수(객체)인 rec 의 내용을 데이타베이스 파일에 저장을 해주게 됩니다. 그럼 데이타가 입력이 되게 되죠. 그럼 프로그램을 실행한 후에 "InsertData1" 버튼을 눌러봅니다. 화면상에는 아무런 변화는 일어나지 않을 것입니다. 그럼 프로그램을 바로 종료를 하고 프로젝트 윈도우에 등록이 된 "kissmacDB" 내용을 더블클릭하여 테이블 리스트 윈도우를 나타나게 합니다. 그곳에서 앞서 만들었던 "AddressList" 테이블을 확인할 수 있을 것 입니다. "AddressList" 테이블을 선택하면 오른쪽의 "View Data" 버튼이 활성화 될 것입니다. 이 "View Data" 버튼을 눌러 봅니다. 그럼 테이블 내의 데이타를 확인할 수 있는 윈도우가 나타나게 됩니다. 왼쪽 상단의 입력 필드는 SQL 문을 입력하는 부분입니다. 이곳을 통해서 데이타베이스 파일에 저장이 되어있는 데이타들을 SQL 문의 Select 문을 통해서 검색할 수 있습니다. 기본적으로 "Select * from [AddressList]" 라는 내용이 입력되어있을 것 입니다. 그 상태에서 오른쪽의 "Query" 버튼을 눌러봅니다. 그러면 금방 입력한 데이타를 확인할 수 있을 것입니다.


제대로 입력이 된 것을 확인했으면 DatabaseRecord 클래스를 통해서 데이타가 잘 입력된다는 것을 알았을 것입니다. 위와 같은 방법은 항상 데이타를 입력할 때 사용되는 방법입니다. 데이타의 양이 더 늘어나거나 줄어드는 차이일 뿐 기본은 똑같기 때문에 위의 DatabaseReocrd 클래스 사용에 대해서 잘 기억해 두시고 많은 연습 해보시기 바랍니다.

그럼 이제는 SQL 문의 Insert 명령어를 이용해서 똑같은 데이타를 입력해보도록 하겠습니다. SQL 문의 Insert 내용에 대해서는 지난 강좌에서 다루었기 때문에 쉽게 이해할 수 있으실 것입니다. 이제 이를 위해서 새로운 버튼을 하나더 추가를 해보죠. 좀 전에 만든 "Insert Data1" 버튼 옆에 "Insert Data2" 로 캡션을 지정한 PushButton 콘트롤을 하나 위치시킵니다. 버튼 위치야 여러분들 임의로 하시면 되는것이구요..^^;; 그리고 그 버튼의 Action 이벤트 내에 다음과 같이 코드를 작성해 보도록 합니다.
dim DB as REALDatabase
dim f as FolderItem
dim SQL as String

f = DesktopFolder.child("kissmacDB")

DB = New REALDatabase
DB.DatabaseFile = f

if DB.Connect= false then
111111MsgBox "데이타베이스 파일 오픈시 에러~!"
111111return
end if

SQL = "Insert Into AddressList("
SQL = SQL+"Name, CellPhoneNum, HomePhoneNum, Address, UID) "
SQL = SQL+"Values "
SQL = SQL+"('kissmac', '010-7777-7777', '02-777-7777', 'Seoul, Korea', 1)"

DB.SQLExecute(SQL)
if DB.Error then
111111MsgBox DB.ErrorMessage
111111return
end if

DB.Close
위의 코드 내용 중 첫번째는 앞서 했었던 DatabaseRecord 클래스를 이용할 때와 동일 합니다. 다른 점은 DatabaseRecord 클래스 타입의 변수(객체)를 지정하지 않고 SQL 이라는 문자형 변수에 SQL 문을 작성해서 대입을 한 것이죠. 이런식으로 하나의 문자형 변수를 선언한 뒤에 데이타를 입력해서 SQL 문을 실행하는 것은 일반 적인 사용방법입니다. 그리고 너무 긴 소스는 반복적인 대입과정을 통해서 세로로 길게 볼 수 있도록 하는 것이 가독성이 좋습니다. 변수명도 SQL 도 해서 조금 혼동을 가져올 수 있는데요. 저는 항상 SQL 문장을 갖고 있는 문자형 변수의 이름을 "SQL"로 지정을 합니다..^^;; 그래야 소스 내에서 아~! 이것이 SQL 문장이구나를 쉽게 알 수 있기 때문이지요. 여튼 DatabseRecord 클래스 변수(객체)를 초기화 하는 내용 대신에 다음과 같은 SQL 문장을 조합해서 만든것을 잘 눈여겨 보시기 바랍니다.
SQL = "Insert Into AddressList("
SQL = SQL+"Name, CellPhoneNum, HomePhoneNum, Address, UID) "
SQL = SQL+"Values "
SQL = SQL+"('kissmac', '010-7777-7777', '02-777-7777', 'Seoul, Korea', 1)"
위의 내용은 이전 강좌에서 배웠던 Insert 명령어 입니다. Insert 명령어 뒤에 Into 라는 접속어와 그 뒤에 "AddressList" 라는 Table 이름을 기록했습니다. 그리고 괄호 내에 먼저 데이타가 입력될 필드명이 들어가고 Values 라는 접속어를 통해서 그 뒤에 순서대로 해당 필드에 들어갈 데이타가 기록되게 됩니다. 주의 할점은 적은 필드 순서대로 데이타의 순서도 맞춰서 입력해야한다는 것이고 문자형이면 ' ' 사이에 내용을 기록하고 정수형이면 그냥 입력을 하면 됩니다. 앞서도 잠시 말씀드렸지만 이러한 긴 SQL 문을 작성할 때에는 확인하기 쉬운 별도의 문자형 변수를 이용하여 SQL 문을 기록하여 사용하는 것이 편리합니다. SQL 문에 입력되는 데이타는 동일한 데이타를 입력했습니다. 하지만 여기에서 다른 값은 맨 마지막의 UID 값입니다. 이 값을 처음 AddressList 테이블을 설계시에 Primary Key 로 지정을 하였기 때문에 처음 DatabaseRecord 클래스를 이용하여 데이타를 입력 할때와는 다르게 1이라는 값을 입력하게 하였습니다. 다시 말씀드리지만 Primary Key 로 지정된 필드에는 같은 값이 2번이상 중복되어서 들어갈 수는 없습니다.

마지막 코드 부분은 에러 처리는 동일하지만 그 전에 데이타를 입력할 때 사용되는 Database 클래스의 함수는 DatabaseRecord 클래스를 이용할 때와는 조금 다릅니다. SQL 문을 이용하여 Select 문이 아닌 다른 명령어를 사용할 때에는 항상 SQLExecute 함수를 사용하면 됩니다. 따라서 이때에도 DB.SQLExecute(SQL) 식으로 SQLExecute 함수를 사용하여 데이타를 입력했습니다.

그럼 위와 같이 코드를 모두 작성했으면 프로그램을 실행시켜보도록 합니다. 그리고 "Insert Data2" 버튼을 눌러 봅니다. 이때에도 화면상의 변화는 전혀 없을 것입니다. 이제는 프로그램을 종료한 다음에 다시 프로젝트 윈도우에 있는 "kissmacDB" 를 더블클릭하여 AddressList 테이블을 선택한 뒤에 View Data 버튼을 눌러서 그 안에 입력된 데이타를 확인해 보시기 바랍니다.


3) 추가된 데이타 수정하기
그럼 이제 데이타를 입력하는 것을 해 봤으니 수정하는 것을 알아보도록 합니다. 데이타의 수정은 SQL 문의 Update 명령어와 RecordSet 클래스를 이용하여 데이타를 수정할 수 있습니다. 하지만 RecordSet 클래스는 아직 배우지 않았기 때문에 뒤에가서 해보도록 하죠. 우선 SQL 문을 이용한 데이타의 수정에 대해서 알아보도록 하겠습니다. SQL 문의 Update 명령어를 이용하려면 당연히 데이타베이스에 데이타가 기록되어있어야 합니다. 그럼 앞서 기록을 했던 내용에 대해서 수정을 해보도록 합니다. 먼저 데이타 수정을 위한 작업을 하기 위해 앞서했었던 예제를 계속 이어서 하도록 하겠습니다.
그럼 앞서 했었던 방식 그대로 화면에 PushButton 콘트롤을 "Insert Data" 버튼 하단에 하나더 추가를 합니다. PushButton 의 Caption 속성은 "데이타 수정1" 이라고 합니다. (뒤에가서 "데이타 수정2" 버튼은 RecordSet 을 통한 데이타 수정을 할 때 추가할 것 입니다.) 그리고 그 버튼의 Action 이벤트에 다음과 같은 코드를 작성합니다.
dim DB as REALDatabase
dim f as FolderItem
dim SQL as String

f = DesktopFolder.child("kissmacDB")

DB = New REALDatabase
DB.DatabaseFile = f

if DB.Connect= false then
111111MsgBox "데이타베이스 파일 오픈시 에러~!"
111111return
end if

SQL = "Update AddressList Set Name='kissmac2', "
SQL = SQL+" CellPhoneNum='017-999-9999', "
SQL = SQL+" HomePhoneNum='031-578-5789', "
SQL = SQL+" Address='Soowon, Korea' "
SQL = SQL+" Where UID=1"

DB.SQLExecute(SQL)
if DB.Error then
111111MsgBox DB.ErrorMessage
111111return
end if

DB.Close
위의 내용은 Insert 문을 이용하여 데이타를 입력했었던 코드와 SQL 문을 제외하고는 모두 동일합니다. SQL 문을 이용할 때 처음 부분과 SQL 문을 실행하기 위한 SQLExecute 문을 동일하게 사용되기 때문입니다. SQL 문의 내용을 보면 다음과 같습니다. 지난 강좌에서 배웠던 Update 명령어의 문법을 생각하면서 분석을 해보도록 하겠습니다. 먼저 Update 명령어가 오고 바로 Table 명인 AddressList 가 위치합니다. 그리고 그 이후에 변경할 필드와 필드에 들어갈 데이타가 입력되게 됩니다. Table 명과 필드의 값을 수정하는 문장 사이에는 Set 이라는 접속어가 위치하게 되죠.
SQL = "Update AddressList Set //처음의 Update 문장 이용
나머지 부분은 모두 해당 Field 명에 Field Type 에 맞는 적절한 수정될 데이타가 입력되는 부분입니다.
SQL = SQL+" CellPhoneNum='017-999-9999', "
SQL = SQL+" HomePhoneNum='031-578-5789', " //해당 필드에 수정되는 데이타가 입력된 부분
SQL = SQL+" Address='Soowon, Korea' "
그리고 주의할 점은 맨 마지막의 조건문인 Where 절 입니다. 여기에서 앞서 설명했던 고유 값의 사용 부분이 나오게 되는데요. 데이타를 수정하기 위해서 Name 이나 PhoneNum 필드를 조건으로 이용한 것이 아니라 중복 될 수 없는 값을 갖는 UID 필드를 조건에 이용했다는 점 입니다. 이렇게 고유값을 이용하면 간단한 조건을 이용하여 원하는 데이타의 내용을 수정할 수 있습니다.
SQL = SQL+" Where UID=1" //마지막의 Where 조건문
여기까지 하면 데이타를 수정하는 코드를 추가한 것 입니다. 그럼 바로 프로그램을 실행시켜서 데이타를 수정해 보도록 합니다. 프로그램을 실행시켜서 추가했었던 "데이타 수정1" 버튼을 누르시기 바랍니다. 이때에도 크게 화면의 변화는 없습니다. 버튼을 누르고 나서 프로그램을 다시 종료한뒤에 프로젝트 윈도우에 있는 kissmacDB 를 앞서 확인했던 것처럼 검색해봅니다. 그럼 데이타가 변경된 내용을 바로 확인 할 수 있을 것 입니다.

4) 데이타 삭제하기
데이타 수정을 했으니 이제는 데이타 삭제를 해보도록 하겠습니다. 데이타의 수정도 앞서 했었던 SQL 문의 Update 와 마찬가지로 SQL 문의 Delete 명령어를 이용하는 방법과 RecordSet 클래스를 이용하는 방법 2가지 방법이 있습니다. 모든 데이타를 삭제할 경우에는 가장 무식한 방법으로 데이타베이스 파일을 삭제(RealDatabase일 경우)해버리고 다시 생성하는 것도 하나의 방법일 수 있습니다. 하지만 데이타베이스 내의 특정 데이타 파일을 삭제할 경우에는 반드시 SQL 문의 Delete 명령어를 이용하거나 RecordSet 클래스를 이용하여 삭제할 수 밖에 없습니다. 그럼 데이타 삭제를 해보도록 하겠습니다. 이전 예제를 계속 이용하여 이번에는 삭제를 위한 PushButton 콘트롤을 하나 위치시킵니다. 그리고 Caption 속성을 "Delete Data"라고 설정합니다. 그리고 Action 버튼에 다음과 같은 코드를 작성하도록 합니다.
dim DB as REALDatabase
dim rec as DatabaseRecord
dim f as FolderItem
dim SQL as String


f = DesktopFolder.child("kissmacDB")

DB = New REALDatabase
DB.DatabaseFile = f

if DB.Connect= false then
111111MsgBox "데이타베이스 파일 오픈시 에러~!"
111111return
end if

SQL = "Delete from AddressList where UID=0"


DB.SQLExecute(SQL)
if DB.Error then
111111MsgBox DB.ErrorMessage
111111return
end if

DB.Close
이 코드도 앞서 했었던 데이타를 수정할 때 사용되는 Update 문을 할 때와 처음과 마지막 부분은 동일합니다. 대신 중간에 데이타를 삭제하도록 해주는 SQL 문만이 차이가 있는 것입니다. Select 문을 제외한 SQL 문의 작성시에는 위의 예 처럼 항상 SQL 문을 어떤것을 사용하였느냐만 차이가 날 뿐 실행은 SQLExecute 함수를 통해서 실행되는 것이 모두 동일합니다. 그럼 중간에 있는 데이타를 삭제하는 SQL 문을 보도록 합니다.
SQL = "Delete from AddressList where UID=0"
위의 코드는 Delete 라는 명령어를 사용했고 별도의 필드명은 지정되지 않았습니다. Delete 에서는 Field 내용만 지우는 것은 없고 기록된 레코드 데이타만을 지워주는 역할을 하기 때문입니다. 만약에 여러개의 필드중에 해당 레코드 데이타에 몇개의 필드 내용만 삭제하겠다고 하면 그것은 Update 문을 통해서 하면 되겠죠. Delete 문은 기록된 데이타 자체를 지우는 역할을 합니다. 이 문자의 뒷 부분을 보면 where 에서 'UDI=0' 라는 부분이 있습니다. 이 뜻은 UID가 0인 값만 삭제를 하겠다는 것입니다.
따라서 위의 SQL 문을 실행시키게 되면 처음 입력했었던 내용이 삭제가 됩니다. 그럼 우선 프로그램을 실행시키고 "Delete Data" 버튼을 눌러봅니다. 이때에도 다른 화면 변화는 없습니다. 바로 프로그램을 종료한 후에 프로젝트 윈도우의 "kissmacDB" 를 더블클릭하여 테이블 리스트에서 "AddressList" 를 선택하여 "View Data"버튼을 눌러서 삭제된 데이타를 확인해 보시기 바랍니다.

물론 모든 데이타를 삭제하도록 하려면 Where 절을 제외하고 "Delete From AddressList" 만 기록하고 실행을 하면 입력된 모든 데이타가 삭제되게 됩니다. 이 또한 직접 해보시기 바랍니다.

앞서 예제를 통해서 데이타의 입력과 수정, 삭제를 해보았습니다. 특히 데이타의 수정과 삭제시에는 SQL 문만을 이용했습니다. 하지만 앞서 잠시 언급한 것처럼 SQL 문을 이용한 데이타의 수정이나 삭제 외에도 RecordSet 클래스를 통해서도 데이타를 수정하고 삭제할 수 있다고 하였습니다. 따라서 이번에는 RecordSet 이 무엇인지 알아보고 RecordSet을 이용해서 데이타를 수정하고 삭제해보도록 하겠습니다. 그리고 그 이전에 RecordSet 의 주 기능인 데이타를 검색하는 것에대해서도 알아보고 데이타를 리얼베이직상에 출력을 해보도록 하겠습니다. 그럼 RecordSet 에 대해서 알아보도록 하죠.

1) RecordSet 클래스에 대해서..
RecordSet 클래스는 데이타베이스 시스템에 기록된 데이타, 즉 레코드들을 다룰 때 사용됩니다. 데이타의 입력은 DatabserRecord 클래스나 SQL 문의 Insert 문을 이용하여 입력이 되지만 입력된 데이타에 대한 대부분의 모든 동작(검색, 수정, 삭제)은 RecordSet 클래스를 통해 이루어 집니다. 그래서 클래스 명도 RecordSet 이 되는 것이죠. 예전(Realbasic 4.x 이하) 버젼에서는 RecordSet 클래스가 아니라 DatabaseCursor 클래스를 통해서 동일한 동작을 하게 됐지만 DatabaseCursor 이라는 말이 처음 접하는 사람들에게 혼동을 줄 수 있어서 그런지 같은 기능을 같은 새로운 이름의 RecordSet 클래스가 등장하였습니다. *데이타베이스 용어로는 RecordSet 이라는 말보다는 Cursor 라는 말을 더 많이 사용하더군요. 따라서 기존에 리얼베이직의 데이타베이스에 대해서 공부를했거나 경험해보신 분들은 DatabaseCursor 클래스와 RecordSet 클래스는 동일하고 이름만 다른 것이며 앞으로는 RecordSet 클래스를 이용해야한다는 점을 염두해 두시기 바랍니다.

RecordSet 클래스가 주로 사용되는 부분은 앞서 언급한 것 처럼 SQL 문의 Select 문을 이용한 데이타의 검색과 데이타의 수정, 삭제입니다. RecordSet 클래스는 단독적으로 사용될 수 없고 데이타를 우선 검색한 후에 그 내용을 수정하거나 삭제하기 때문에 항상 SQL 문의 Select 명령어가 같이 사용되게 됩니다. 그리고 RecordSet 의 초기화는 New 명령어를 통해서 초기화 되는 것이 아니라 Database 클래스의 SQLSelect 함수를 통해서 리턴되는 RecordSet 값을 통해서 초기화 되게 됩니다. 그럼 우선 RecordSet 클래스의 속성과 함수에 대해서 자세히 알아보도록 하겠습니다.

2) RecordSet 클래스의 속성(Properties)
RecordSet 클래스의 속성은 4개의 속성을 갖고 있습니다. 이중에서 많이 사용되는 속성은 EOF 속성 외에는 많이 사용되지 않게 됩니다. 그래도 내용을 잘 이해하여 잘 활용해 보시기 바랍니다.

*BOF : 데이타베이스에 기록된 데이타의 첫번째인지 아닌지를 알려줍니다. 참과 거짓을 나타내는 Boolean 형의 데이타이며 첫번째 기록된 데이타일 경우는 True 를 리턴합니다. 거의 사용되지 않는 속성입니다.
*EOF : 데이타베이스에 기록된 데이타의 마지막이나 검색된 데이타의 마지막임을 알려주는 속성입니다. BOF 과 동일하게 참과 거짓을 나타내는 Boolean 데이타입니다. 기록된 데이타의 끝일 경우 이 값은 True 가 되고 아닐 경우는 항상 False 값을 갖습니다. 별로 사용되지 않은 BOF 에 비해서 EOF 속성은 데이타의 검색시에 항상 While ~ Wend 구문과 같이 사용되는 기본적이면서도 중요한 속성입니다.
이 값이 True 일 경우를 체크하지 않고 데이타를 검색하다보면 종료가 되지 않고 무한루프에 빠지는 경우가 생기기 때문에 코드 사용에 항상 유희 해야합니다. 다음의 예는 EOF 속성이 While 문과 같이 사용되는 것을 보여줍니다.
while not rs.EOF
111111Name = rs.Field("Name").StringValue
111111rs.MoveNext
wend
위의 코드에서는 EOF 속성이 참이 아닐 경우에 계속 루프가 돌도록 되어있는 예제 코드입니다. 데이타베이스의 데이타 검색은 위와 같은 방식으로 많이 이루어지니 간단한 코드라도 형식을 잘 익혀두도록 하시기 바랍니다.

*FieldCount : 해당 Table 의 Field 가 몇개있는지를 알려주는 속성입니다. 데이타 유형은 갯수를 표현해주기 때문에 정수형인 Integer 형입니다. FieldCount 를 별도로 구하는 경우는 없기 때문에 많이 사용되지는 않습니다.
* RecordCount : 데이타베이스에서 기록된 데이타를 레코드라고 합니다. 즉 이 속성은 기록 된 데이타의 수를 알려주는 속성입니다. 하지만 이 속성은 모든 데이타베이스 시스템에서 지원되지 않고 OpenBase, MySQL, PostgreSQL, 4D 에서만 지원되는 속성입니다. 다른 데이타베이스 시스템에서는 SQL 문의 Count 함수를 이용하면 동일한 결과를 얻을 수 있습니다. 따라서 위의 해당 Database 시스템에서도 코드의 호환성을 위해서 대부분 SQL 문의 Count 함수를 이용하여 기록된데이타의 갯수를 추출하는 경우가 많습니다. 예를 들어서 MySQL 에서 위의 속성을 이용하여 기록된 데이타의 수를 구했는데 데이타베이스 시스템이 Oracle 로 바뀐다면 새로 코드를 작성해야하는 경우가 생기기 때문입니다. 따라서 코드의 호환성을 위해서는 되도록 SQL 문의 Count 함수를 이용하여 갯수를 추축하시기 바랍니다. 데이타 유형은 기록된 데이타의 갯수를 표현해주기 때문에 정수형인 Integer 형입니다.

3) RecordSet 클래스의 함수(Methods)
RecordSet 의 함수에는 10정도의 여러가지 함수가 존재합니다. RecordSet 에 포함된 함수들은 대부분 데이타베이스에 기록된 데이타를 가져오기 위한 레코드의 이동이나 Field 명을 지정하여 가져오기 위해 존재하는 함수들이 대부분입니다. 그리고 그 외 데이타의 수정과 삭제를 위한 함수가 존재합니다. 가장 많이 사용되는 함수는 MoveNext 와 Field, IdxField 함수입니다. 물론 다른 함수들도 어떻게 사용하느냐에 따라 빈도수는 다르겠지만 일반적으로 위의 함수들이 가장 많이 사용되게 되므로 이 함수에 대해서 잘 알아두시기 바랍니다. 그럼 RecordSet 의 함수에 대해서 자세히 알아보도록 하죠.

*MoveFirst : 기록된 데이타(레코드)의 첫번재 부분으로 이동으로 하도록 합니다. 데이타검색시 중간정도 읽었다 하더라도 이 함수를 이용하면 처음부터 다시 돌아가서 검색을 하게 됩니다. 그다지 많이 사용되지는 않습니다. 주로 툴바에 포함된 콘트롤인 DataControl 콘트롤을 이용할 때 사용되는 함수이지만 DataControl 콘트롤 자체를 데이타베이스를 잘 이해하고 나면 거의 사용하지 않게 됩니다.
*MoveLast : MoveFirst 와 동일한 기능을 하지만 처음이 아니라 데이타의 마지막으로 이동을 해주는 함수입니다. 사용 빈도수나 용도는 MoveFirst 함수와 동일합니다.
*MoveNext : MoveNext 함수는 데이타 검색시에 순서대로 다음다음 레코드로 이동을 해주게 하는 함수입니다. 이 함수는 일반적인 SQL 문중 Select 문 사용시에 다음 다음 데이타로 이동하게 해주기 때문에 Select 문 사용시에는 항상 사용된다고 보시면 됩니다. 앞서 EOF 속성의 간단한 예제코드에도 나와있습니다. Select 문을 이용하여 데이타를 검색할 때에는 항상 끝 부분에 MoveNext 함수를 사용해야 다음 데이타로 이동을 하게 되고 데이타의 끝까지 도달하게 됩니다. 따라서 MoveNext 함수를 이용하지 않고 While ~ Wend 루프문을 이용하게 되면 데이타가 변경되지도 않을 뿐만 아니라 무한루프에 빠지게 됩니다. RecordSet 클래스 함수중에서 가장 많이 사용되는 함수중 하나이니 그 사용 방법에 대해서 잘 알아두시기 바랍니다.
*MovePrevoius : MoveNext 와는 반대로 이전 데이타로 이동을 해주게 하는 함수입니다. 이 함수는 MoveNext 와는 다르게 거의 사용되지 않는 함수입니다. 쓰임새는 MoveFirst, MoveLast 와 비슷한 용도로 사용됩니다.
*Field : 검색된 레코드의 해당 필드에 포함된 데이타를 가져올 때 그 해당 필드를 나타내주는 함수입니다. Field 함수명은 해당 필드명을 인수로 취하게 됩니다. Table 에 포함된 필드명이 반드시 들어가야 하며 존재하지 않는 필드명을 인수로 사용했을 경우에는 에러가 발생하게 됩니다. Database 프로그램을 제작할 경우에는 대부분 데이타베이스의 Table 구조는 미리 파악을 하거나 별도의 구조도를 이용하여 작업을 하게 됩니다. 따라서 해당 필드명을 이용하여 필드 값을 가져오는 경우가 가장 많이 사용되게 됩니다. Field 함수에서 사용되는 인수의 타입은 필드명을 나타내기 때문에 문자형 타입인 String 형이 됩니다. FIeld 함수 사용시에는 필드명을 적기 때문에 검색을 위한 SQL 문인 Select 문에서 필드명을 직접 지정하지 않고 전체를 나타내는 "*" 를 적는 경우에 많이 사용됩니다.
다음의 예를 보도록 하죠.
Select * from AddressList
위의 구문에서는 특정한 필드명을 지정하지 않고 전체 필드를 지정했다는 식으로 필드명 부분에 "*"를 사용했습니다. 이럴 경우 Field 함수를 사용하게 됩니다. 필드명을 지정하는 경우는 다음에 나오는 IdxField 함수를 사용하게 됩니다.

*IdxField : IdxField 함수는 Field 함수와 기능은 동일하지만 Field 함수 사용시 표기하는 SQL 문의 Select 명령어 사용시에 "*" 표시가 되어있지 않고 특정 필드명이 지정되어 있는 경우 사용합니다. 그리고 특정 필드가 지정되어있기 때문에 필드명을 넣는 것이 아니라 순서대로 그 순서의 값을 넣게 되는 것이죠. 따라서 사용하는 인수로는 Select 문에서 지정한 필드명 순서 값을 사용하게 됩니다.
다음의 예를 보도록 하죠.
Select Name, Age, PhoneNum, Address From AddressList
위의 SQL 문에서는 "*" 표시 대신 Name, Age, PhoneNum, Address 라는 필드명을 입력하였습니다. 이 순서는 첫번째가 Name 이 되고 마지막이 Address 가 되는 것이죠. 따라서 위와 같은 경우에는 IdxField(1) 번이 Name 필드를 나타내는 것이고 IdxField(2) 는 Age 필드를 나타내는 것 입니다. 이를 Field 함수를 이용할 경우는 Field("Name") 이나 Field("Age") 와 같은 것입니다. 특별한 필드명 지정 없이는 Field 함수를, 위와 같이 특정 필드를 지정할 경우는 IdxField 함수를 사용하면 됩니다. IdxField 함수의 앞에 Idx 라는 문장은 Index 의 줄임말인 것이죠. 그리고 Select 문에서 필드명의 순서는 임의대로 순서를 넣을 수 있습니다.

*Edit : Edit 는 데이타를 수정할 때 사용됩니다. 앞서 SQL 문의 Update 명령어를 이용하여 데이타를 수정하는 것을 공부했었습니다. RecordSet 클래스를 이용해서는 이 Edit 함수를 통해서 데이타를 수정할 수 있도록 되어있습니다. RecordSet 클래스의 Edit 함수를 이용할 경우에는 Select 문을 이용하여 우선 해당 데이타를 검색 한 후에 RecordSet 변수(객체)를 초기화 하고 Edit 이라는 함수를 사용한 후에 해당 필드에 수정할 데이타 값을 입력하면 됩니다. 이에 대한 좀 더 자세한 활용 예제는 뒤에가서 예제를 통해서 알아보도록 하겠습니다.
*Update : Edit 함수와 같이 사용되는 함수입니다. Edit 함수를 적용 한 이후 데이타를 수정한 다음에 마지막에 이 Update 함수를 실행해줘야만 수정된 내용이 실질적으로 적용이 되게 됩니다. 항상 Edit 함수와 상을 이루면서 사용된다는 것을 염두해 주시기 바랍니다. 이에 대한 예제도 RecordSet 클래스를 이용한 데이타 수정 예제 부분에서 같이 하게 될 것입니다.
*DeleteRecord : 이는 Select 문을 통해서 검색된 데이타(레코드)를 삭제할 때 사용됩니다. 즉 SQL 문의 Delete 명령어를 사용하는 것과 동일한 역학을 하는 함수입니다. 이에 대한 자세한 내용도 뒤에 예제를 통해서 확인을 해 볼 수 있습니다.
*Close : RecordSet 변수(객체)를 종료할 때 사용됩니다. 대부분의 RecordSet 변수(객체)는 해당 영역에서만 동작을 하는 Local 변수로 사용이 되기 때문에 굳이 Close 함수를 사용하는 경우는 거의 없습니다. 하지만 Global 변수 식으로 사용할 경우에는 반드시 이 함수를 사용해서 종료 해주시기 바랍니다.

4) DatabaseField 클래스...
그럼 RecordSet 을 통한 예제를 하기 전에 먼저 알아두어야 할 부분이 RecordSet 클래스의 IdxField 나 Field 함수가 사용될 때 해당 필드의 타입을 지정해주는 DatabaseField 클래스 입니다. DatabaseField 클래스는 항상 RecordSet 클래스의 IdxField 나 Field 함수 바로 뒤에 "." 접속 표기문 다음에 오고 해당 필드 타입에 따라 표기 내용이 바뀌게 됩니다. 그럼 다음의 속성을 확인해 보도록 하겠습니다.

- DatabaseField 클래스의 속성
*BooleanValue : 참과 거짓을 나타내는 Boolean 형 타입의 데이타를 가져올 때 사용됩니다.
*DateValue : Date 타입의 필드에서 값을 가져올 때 사용됩니다.
*DoubleValue : 배정도 실수인 Double 형을 가져올 때 사용됩니다.
*IntegerValue : 정수형 값을 가져올 때 사용됩니다.
*StringValue : 문자형으로 값을 가져올 때 사용됩니다. 필드 타입이 정수형이라 하더라도 StringValue 로 가져오게 되면 그 결과값은 문자형 값이 됩니다.
*Value : Variant 타입의 데이타를 가져올 때 사용됩니다.

- DatabaseField 클래스의 사용
DatabaseField 클래스의 사용법은 항상 Field 함수나 IdxField 함수 뒤에 사용 된다고 하였습니다.
다음의 예를 보도록 하죠.
Name = rs.Field("Name").StringValue
Age = rs.Field("Age").IntegerValue
PhoneNum = rs.Field("PhoneNum").StringValue
위의 예제는 아주 간단한 예를 보여준 것입니다. 문자형 필드인 Name 필드의 값을 Name 이라는 변수에 기록을 하고 Age 필드는 Age 라는 변수에 PhoneNum 필드의 값을 PhoneNum 필드에 기록을 한 것입니다. 뒤에 붙는 StringValue 나 IntegerValue 라는 내용들이 DatabaseField 클래스의 사용을 보여줍니다. 위의 예에서 보는 것 처럼 DatabaseField 클래스는 변도의 초기화나 선언은 필요로 하지 않고 단순히 Field 함수나 IdxField 함수 뒤에 붙어서 사용되게 됩니다. 그럼 이제 실질적인 예를 통하여 RecordSet 클래스 사용에 대해서 알아보도록 하겠습니다.

5) RecordSet 을 이용한 데이타 검색, 수정, 삭제
그럼 RecordSet 에 대해서 공부를 해봤으니 본격적으로 RecordSet 을 이용한 예제를 해보도록 하겠습니다. RecordSet 을 통해서 할 수 있는 작업은 가장많이 사용되는 데이타의 검색과 수정 및 삭제 입니다. 그럼 예제를 해보도록 하죠.

- RecordSet 을 이용한 데이타 검색
처음부터 계속 이어오고 있는 AddressList 를 통한 예제를 이용해서 RecordSet 을 이용한 데이타의 검색을 해보도록 하겠습니다. 우선 앞서 했었던 예제에서 검색 결과를 나타내기 위해서 ListBox 콘트롤을 윈도우에 추가해보도록 하겠습니다. 당연히 Window 의 사이즈도 조절을 해야겠지요. 원하는 방법으로 사이즈를 조절하고(가로 길이는 넉넉하게 만들어 놓으세요. 가로폭은 470정도가 좋습니다.) 이미 만들어진 버튼들은 상단에 가지런히 정렬을 하고 하단 부분에 ListBox 콘트롤 하나는 위치시킵니다. 그리고 생성된 ListBox1 콘트롤의 속성을 다음과 같이 변경합니다.

*Name 속성 : SearchListbox
*Width 속성 : 442
*ColumnCount 속성 : 5
*HasHeading 속성 : True
*InitialValue : UID Name CellPhone HomePhone Address (사이사이는 Tab 값을 넣어줘야합니다.)

그리고 버튼들 맨 하단에 PushButton 콘트롤을 하나더 추가를 하고 Caption 속성을 "Search" 라고 입력합니다. 이곳의 Action 버튼에는 데이타를 검색하는 코드를 뒤에 추가할 것입니다. 그럼 다음과 같이 화면이 구성됩니다.

이제 Search 버튼의 Action 이벤트 내에 다음과 같은 코드를 작성합니다.
dim DB as REALDatabase
dim f as FolderItem
dim SQL as String
dim rs as RecordSet
dim Name, CellPhoneNum, HomePhoneNum, Address as String
dim UID as Integer

f = DesktopFolder.child("kissmacDB")

DB = New REALDatabase
DB.DatabaseFile = f

if DB.Connect= false then
111111MsgBox "데이타베이스 파일 오픈시 에러~!"
111111return
end if

SQL = "Select * from AddressList order by UID"

rs = DB.SQLSelect(SQL)
if rs= nil then
Return
end if


SearchListBox.DeleteAllRows

while not rs.EOF
111111UID = rs.Field("UID").IntegerValue
111111Name = rs.Field("Name").StringValue
111111CellPhoneNum = rs.Field("CellPhoneNum").StringValue
111111HomePhoneNum = rs.Field("HomePhoneNum").StringValue
111111Address = rs.Field("Address").StringValue

111111SearchListBox.Addrow str(UID)
111111SearchListBox.cell(SearchListBox.LastIndex, 1) = Name
111111SearchListBox.cell(SearchListBox.LastIndex, 2) = CellPhoneNum
111111SearchListBox.cell(SearchListBox.LastIndex, 3) = HomePhoneNum
111111SearchListBox.cell(SearchListBox.LastIndex, 4) = Address

111111rs.MoveNext
wend
위의 코드 중 처음 부분인 초기화 부분은 기존의 앞서 했었던 코드와 동일합니다. 하지만 변수 선언 부 중에 먼저 AddressList 테이블에 있는 Field 의 항목을 표시하기 위한 변수 설정이 보입니다. 그리고 데이타를 가져올 때 사용되는 RecordSet 클래스 변수(객체)인 rs 라는 선언부도 보입니다.
dim rs as RecordSet //RecordSet 클래스 변수 선언
dim Name, CellPhoneNum, HomePhoneNum, Address as String //AddressList 테이블 내의 Field 값을 가져오기 위한 변수
dim UID as Integer //UID 변수 설정
그리고 중간 부분의 SQL 문에는 단순한 검색 명령어인 Select 문이 사용된 것을 확인할 수 있습니다.
SQL = "Select * from AddressList order by UID"
위의 SQL 문은 Select 명령어를 사용하여 검색을 위한 SQL 문임을 바로 알 수 있습니다. 필드명은 별도로 지정을 하지 않고 "*" 표시를 이용하였구요. 마지막 부분의 Order By 명령어는 UID 값을 이용하여 내림차순으로 정렬을 하라는 것을 나타냅니다.

그리고 SearchListbox 내에 어떤 내용이 있으면 지워주는 DeleteAllRows 함수를 이용하여 SearchListbox 를 초기화 해주었구요. 그 다음의 내용은 While ~ Wend 루프문을 이용하여 검색된 내용을 반복적으로 구하는 부분입니다. 여기에서 While 문의 첫번째 줄에서 RecordSet 클래스의 변수(객체)인 rs.EOF 라는 코드를 확인할 수 있습니다. 이 부분은 EOF 가 참이면 반복문을 멈추고 거짓이면 계속 반복문을 수행하라는 뜻입니다. 그래서 그 앞에 Not 이라는 코드가 들어가 있는 것입니다. While 구문 내에는 실질적인 데이타를 가져오는 부분이 표기되어있습니다. 앞서 RecordSet 클래스의 함수와 DatabaseField 클래스 내용에서 배웠던 내용이 그대로 적용이 되어 데이타베이스 내의 Field 값을 가져오는 부분이 작성되어있습니다. 예를 들어서 다음의 코드는 CellPhoneNum 필드의 문자형 값을 CellPhoneNum 문자형 변수에 입력을 하라는 내용입니다.
CellPhoneNum = rs.Field("CellPhoneNum").StringValue
그리고 While 구문 내의 마지막 부분에는 데이타를 다 검색 했을 때 다음 레코드로 이동을 하도록 해주는 RecordSet 클래스의 MoveNext 함수가 사용 되는 것을 확인할 수 있을 것입니다. 그 바로 이전에는 SearchListbox 내에 검색된 데이타들을 추가하는 코드 부분입니다.
SearchListBox.Addrow str(UID)
SearchListBox.cell(SearchListBox.LastIndex, 1) = Name
SearchListBox.cell(SearchListBox.LastIndex, 2) = CellPhoneNum
SearchListBox.cell(SearchListBox.LastIndex, 3) = HomePhoneNum
SearchListBox.cell(SearchListBox.LastIndex, 4) = Address
위와 같이 하고 프로그램을 실행해보시기 바랍니다. 앞서 UID가 0인 데이타를 삭제하는 예제를 했기 때문에 처음에 프로그램을 실행하고 Search 버튼을 누르면 데이타가 1개만 검색이 될 것 입니다. 먼저 "Insert Data1" 버튼을 누르고 "Search" 버튼을 다시 누르면 제대로 모든 데이타가 입력된 결과인 2개의 데이타를 검색할 수 있을 것 입니다.

위와 같이 한다면 프로젝트 윈도우를 통해서 데이타를 보지 않고도 프로그램내에서 데이타를 검색할 수도 있습니다. 지금까지 한 예만 이용을 해도 간단한 데이타 검색 및 수정, 삭제를 하는 프로그램은 만들 수도 있을 것입니다. 그럼 이제는 RecordSet 을 이용하여 데이타를 수정하도록 해보겠습니다.

- RecordSet 클래스를 이용한 데이타의 수정
앞서 SQL 문의 Update 명령어를 이용한 데이타의 수정 예제를 했었습니다. 그럼 이제 RecordSet 클래스를 이용하여 동일한 내용의 데이타 수정 예제를 해보도록 하겠습니다. 먼저 이를 위해서 앞서 했었던 것 처럼 PushButton 을 "데이타 수정1" 버튼 오른쪽에 위치시킵니다. 그리고 Caption 속성은 "데이타 수정2" 지정합니다. 그리고 추가한 "데이타 수정2" 버튼의 Action 이벤트 내에 다음과 같은 코드를 작성합니다.
dim DB as REALDatabase
dim f as FolderItem
dim SQL as String
dim rs as RecordSet

f = DesktopFolder.child("kissmacDB")

DB = New REALDatabase
DB.DatabaseFile = f

if DB.Connect= false then
111111MsgBox "데이타베이스 파일 오픈시 에러~!"
111111return
end if

SQL = "Select * from AddressList where UID=0"

rs = DB.SQLSelect(SQL)
if rs = nil then
111111return
end if

rs.Edit

rs.Field("Name").setString "kissmacMan"
rs.Field("CellPhoneNum").StringValue = "010-777-9999"
rs.Field("HomePhoneNum").setString "042-888-8888"
rs.Field("Address").StringValue = "Daejun City"

rs.Update
위의 코드를 보면 SQL 문의 Update 문을 이용한 "데이타 수정1" 버튼의 Action 이벤트에 있는 코드와 처음 부분은 거의 유사합니다. 단지 이번에도 RecordSet을 이용하였기 때문에 처음의 선언부에 rs 라는 RecordSet 클래스 변수(객체)가 선언이 되었습니다. 그리고 SQL 문으로는 Update 문 대신에 Select 문이 사용됐습니다. RecordSet 클래스를 이용하기 위해서는 항상 데이타 검색이 우선 되어야 하기 때문입니다. RecordSet 클래스에는 선 검색 후 수정 및 삭제라는 점 잊지 마시기 바랍니다. 앞서 했던 예제에서는 UID 값이 1인 데이타를 수정했지만 이번에는 UID 값이 0인 데이타를 수정하도록 했습니다. 따라서 다음과 같은 SQL 검색문이 만들어 진 것입니다.
SQL = "Select * from AddressList where UID=0"
그리고 중간에 잠시 에러 체크를 위한 부분이 있습니다. 이는 Select 문이 혹시 오타나 띄어쓰기 및 몇가지 표기를 제대로 하지 못했을 경우 프로그램이 종료되는 것을 방지하고 에러를 쉽게 파악하기 위한 부분입니다.
if rs = nil then
111111return
end if
그 다음에 앞서 배웠던 Edit 이라는 함수가 사용됐습니다. 먼저 데이타를 검색 한 뒤에 이 Edit 함수를 사용하면 데이타의 수정이구나라고 알면 됩니다.

rs.Edit
그 다음에는 각각의 필드에 값을 대입하는 부분입니다. 그런데 좀 이상한것이 어떤 필드는 SetString 이라는 함수를 통해서 데이타를 입력하였고 어떤 경우는 StringValue 라는 DatabaseField 클래스를 이용하여 문자를 대입하여 수정을 하였습니다. 이는 2가지 표현법이 표현은 다르나 동일한 역할을 하는 것이기 때문에 위처럼 코드를 작성했습니다. 어떤 방법을 사용하던 동일한 결과를 가져오니 편한 방법을 사용하시기 바랍니다. 다만 아래 코드와 같은 표현방법(문법)을 이용하여 데이타를 수정한다라고 잘 알아두시고 익혀두시는 것이 가장 중요합니다.
rs.Field("Name").setString "kissmacMan"
rs.Field("CellPhoneNum").StringValue = "010-777-9999"
rs.Field("HomePhoneNum").setString "042-888-8888"
rs.Field("Address").StringValue = "Daejun City"
그리고 마지막에 Update 함수를 이용하여 수정된 데이타를 변경하도록 했습니다. 마지막에 항상 Update 함수 이용한다는 점. Edit 함수와 항상 쌍을 이루어서 사용된다는 점을 잊지마시기 바랍니다.
rs.Update
위와 같이 작성한 다음에 프로그램을 실행해 봅니다. 그리고 바로 "데이타 수정2"버튼을 눌러봅니다. 이때에도 화면상의 변화는 없지만 이제는 프로그램을 종료하지 말고 앞서 추가한 "Search" 버튼을 눌러서 바로 수정된 데이타를 확인해 보시기 바랍니다. 어떤가요. 수정됐나요? 간단하죠? SQL 문을 이용한 방법이나 RecordSet 클래스를 이용한 방법이나 동일한 경과를 가져오기 때문에 원하는 방법을 사용하시면 됩니다. 필자는 그날의 기분에 따라서 손에 잘 익거나 편리한 방법을 사용합니다...^^;;

- RecordSet 클래스를 이용한 데이타의 삭제
그럼 이제는 RecordSet 클래스를 이용한 데이타의 수정까지 했으니 마지막 부분으로 데이타의 삭제를 해보도록 하겠습니다. 이 역시 "데이타 수정2" 버튼을 추가한 것 처럼 "Delete Data" 버튼 오른쪽에 PushButton 콘트롤인 "Delete Data2" 버튼을 생성합니다. 그리고 Action 이벤트 내에 다음과 같은 코드를 추가합니다.
dim DB as REALDatabase
dim rec as DatabaseRecord
dim f as FolderItem
dim SQL as String
dim rs as RecordSet

f = DesktopFolder.child("kissmacDB")

DB = New REALDatabase
DB.DatabaseFile = f

if DB.Connect= false then
111111MsgBox "데이타베이스 파일 오픈시 에러~!"
111111return
end if

SQL = "Select * from AddressList where UID=0"

rs = db.SQLSelect(SQL)
if rs = nil then
111111return
end if

rs.DeleteRecord
위의 코드는 데이타수정 내용과 거의 비슷한 것을 알 수 있습니다. 데이타의 검색까지는 동일한 코드이며 대신 데이타를 수정하거나 가져오는 부분 없이 데이타 검색 후 바로 RecordSet 클래스의 DeleteRecord 함수를 이용해서 검색된 데이타를 삭제하도록 했습니다.
rs.DeleteRecord
항상 데이타의 삭제가 데이타 베이스에서 가장 간단한 부분인 것 같습니다. 위와 같은 코드를 작성 한 후 프로그램을 실행시키고 "Delete Data2" 버튼을 눌러서 삭제를 실행해 보시기 바랍니다. 그리고 "Search" 버튼을 눌러서 데이타가 제대로 삭제됐는지를 확인해 보시기 바랍니다.

여기까지가 데이타베이스 내용의 일반적인 내용 전부 입니다. 리얼베이직에서의 데이타베이스는 내용은 많은 것 같지만 Database 클래스와 해당 데이타베이스 시스템에 대한 클래스, RecordSet, DatabaseRecord 부분을 이해하고 익혀두는 것이 제일 중요합니다. 그리고 SQL 문의 기본 구문들에 대해서 잘 이해하고 알아두는 것이 중요합니다. 이 내용만 제대로 알고 있으면 데이타베이스 프로그램을 만들기 위한 기본은 모두 갖춰지는 것입니다. 데이타베이스 프로그래밍은 알고보면 많은 내용도 없고 사용법도 복잡하지 않기 때문에 많은 연습을 통해서 금방 익힐 수 있습니다. 대신 어디에 어떻게 이용할 것인가에 대한 활용을 잘 하는것이 더욱 중요합니다. 따라서 다음 강좌에서는 좀 쓸만한 주소록 프로그램을 만들어 보는 것을 통해서 리얼베이직의 데이타베이스 기능을 익혀보도록 하겠습니다. 그리고 첨부 내용으로 Mac OS X 에서 MySQL 의 설치와 활용에 대해서도 알아보도록 하겠습니다.


zzudol : 열심히 공부하고 있습니다.
다음이 궁굼합니다. 언제쯤 올라오는지요
(09월13일)
michelin : 조만간..이번주나 다음주 까지 다음 원고를 올리보도록 하겠습니다.
죄송해요.제가 능력이 부족해서리..^^;;
(09월14일)
zzudol : 재미삼아 공부를 하는데 다음호가 자꾸 굼궁하네요
해설을 잘 해주셔서 초보지만 이해하는데 는 어려움이 없어요
명강의 입니다.
(09월15일)
cucu : MS Office 에서 매크로 작업할때 Real Basic이 어떻게 활용되는가에 대한 예제나 설명도 부탁드립니다. 수고하세요. (09월22일)
Realmac : 성준님, 성준님 리베 사이트에 문제가 있던데... 바쁘신건지요? 무슨 일이 생기신건지... (10월01일)
michelin : 안녕하세요? 미쉐린 김성준입니다.
흠.강좌를 쓰고는 있는데 제가 집안일 돕느라고(아버님이 운영하시는 회사 프로그램을 만들어드렸습니다.) 조금 시간을 제대로 못냈습니다. 조금 쉴 때마다 원고를 작성하고 있어서 너무 진도가 나가지 않군요. 그래도 다음 원고는 거의 준비가 되갑니다. 내용은 많지 않지만 꾸준히 하도록 하겠습니다. 부족한 강의 많이들 기다려 주셔서 감사드리고 죄송합니다.
빨리 다음 강좌 준비하도록 하겠습니다.^^;;
그리고 리베사이트는 사용이 중단이 되었더군요. 드림위즈를 기반으로 다른 분이 운영해주시고 저는 관리만 했는데 흠흠.리베 사이트도 조만간 다시 살려보도록 하겠습니다.^^;;
양해를 바랍니다.
(10월04일)
다음글 - 19회. Database -3-
현재글 - 18회. Database -2-
이전글 - 17회. Database -1-