※ 아래 Daily Tip은 곽승주 강사님이 제공해주신 내용입니다.
프로그래밍의 세상속에도 여러 가지 종류의 프로그래밍이
존재합니다. 게임 프로그래밍, 인터넷 프로그래밍, 임베디드 프로그래밍, 데이터베이스 프로그래밍 등등.
그중에서 게임 프로그래밍은 필자의 주관적인 생각이지만 프로그래밍의 꽃이라고 생각합니다. 또는 하나의
올림픽과 같은 존재입니다.
화려한 그래픽적인 요소, 게임의 즐거움을 배가해주는
적절한 사운드 효과, 요즘에는 네트워크 기능도 필수이죠. 게임 프로그래밍이 꽃이라면 데이터베이스
프로그래밍은 평소에 그 고마움을 느끼지 못하는 공기나 물과 같은 존재이며 한 때 지구를 지배했던
공룡과 같은 존재입니다.
서론이 많이 길었습니다. 이번에는 데이터베이스와 관련된
두 가지의 팁, 2종 세트(?)를 저렴한 가격에 올립니다. ^^
< 레코드셋(Recordset), 잽싸게 동네
한바퀴 돌아보기 >
다른 분들과 마찬가지로 필자도 아무 생각없이 하는 다음과
같은 코딩을 합니다.
Do While Not recordset.EOF
ListBox1.AddItem recordset![Full Name]
recordset.MoveNext
Loop |
위의 코드는 레코드셋의
데이터를 EOF(레코드셋의 끝)가
나올 때까지 순환하면서 ListBox에
항목을 추가하는 예입니다. 물론 위의 코드는
아무런 문제가 없으며 군대용어로 말하면 FM입니다. (FM은
라디오가 아니라 Field Manual의 준말이죠)
그러나 문제는 매번
루프를 돌면서 EOF인가를 확인한다는 점입니다.
이러한 확인이 루프 속도를 떨어뜨리는 원인이 됩니다(CPU의
연산기능(ALU)중 가장 부하가 큰 연산이 비교/판단연산입니다)
물론 레코드셋의 크기가 작다면 속도를 걱정할 필요는 없습니다.
그래서 미리 레코드셋의
레코드갯수를 미리 확인하고 이를 이용하여 단순하게
For~Next루프를 돌리는 것이 낫습니다.
다음의 코드를 보죠
recordset.MoveLast
lngRecCount=recordset.RecordCount
recordset.MoveFirst
For lngCounter=1 To lngRecCount
ListBox1.AddItem recordset![Full Name]
recordset.MoveNext
Next lngCounter |
위의 코드는 레코드셋의
갯수를 lngRecCount변수에
저장하고 다음 번의 For~Next문에서
이용합니다. 조건판단이 없으므로
Do~Loop보다 빠르겠죠.
참고로 위의 코드에서 『레코드셋!필드이름』의
형식으로 필드를 참조하고 있는데 이보다는 『레코드셋.Fields(필드인덱스)
』와 같이 필드의 인덱스 번호를 이용하는 것이 낫습니다.
필자가 주워 들은 바 로는 약
33%의 속도증가 효과가 있다고 합니다.
<말썽 많은 널(NULL) 문자열을 합법으로 만들기>
데이터베이스를 다루다
보면 문법상 아무런 문제가 없는 경우에도 문제를 만나게 됩니다.
그 원인중 하나가 널(NULL)의
존재입니다. 특히 오피스에서는 데이터베이스로
Access를 많이 사용하는데 기본적으로 Access는
문자열값이 필드에 할당되지 않는다면 해당 필드를 Null
스트링("")으로 채웁니다.
필드에
Null이 있고 레코드셋을 읽어서 변수에 저장하는 경우
Run-Time 에러를 만나게 됩니다.
이러한 문제를 피하려면 당연히 Null을 검사해야
합니다. 당연히 일일이 각 레코드셋의 각각의 필드가
널인지 여부를 확인하는 코드를 추가한다면 속도저하의 원인이 될 겁니다.
그러나 다음과 같이 빈
문자열을 연결하여 Null 문자열을 처리합니다.
마치 돈세탁을 하여 합법적인 돈으로 바꾸는 듯한 처리입니다.
Dim DB As Database
Dim RS As Recordset
Dim sYear As String
Set DB = OpenDatabase("Biblio.mdb")
Set RS = DB.OpenRecordset("Authors")
sYear = "" & RS![Year Born] |
위의 코드에서
Year Born이라는 필드에 빈 문자열을 붙여
에러를 살짝 피하게 됩니다.
|