DB에 신규 데이터 추가 혹은 업데이트 하는 조금 더 쉬운 방법

VB 혹은 VBA에서 액세스에 데이터를 넣는 아주 기본적인 방법은 쿼리문을 작성하여 실행(execute) 시키는 방법입니다.

그런데 이렇게 해보신 분들은 아시겠지만, 솔직히 짜증이 나요. 데이터 필드가 많으면 많을수록 더 그래요. 계속 나열하다 보니까 서로 엉키고, 쿼리문 길어지니까 알아보기도 힘들고 그래요. 이게 겪어 보면 알아요.

아무튼 화가나요.

그래서 조금은 다르게, 그리고 조금은 알아보기 쉽게 데이터를 입력하는 방법을 소개하려 합니다.

필드와 값 배열로 만들어 넣기

필드와 각 필드에 넣을 값들을 배열(Array)에 담아서 update 문을 실행 시키는 것입니다. 전체 예제를 한번 보시죠.

Dim mySQL   as String
Dim RS      as New ADODB.RecordSet
Dim Fields  as Variant
Dim Values  as Variant

Fields = Array("TradeDay", "StockID", "Price")
Values = Array("2017-03-14", "KOSPI200", "282.31")

mySQL = "SELECT * FROM Stock_Price WHERE STOCKID='KOSPI200' AND TradeDay='2017-03-24'"
RS.Open mySQL

If RS.EOF Then
    RS.Addnew
    RS.Update Fields, Values
Else
    RS.Update Fields, Values
End If

RS.UpdateBatch
RS.Close

코드가 상당히 길지만 찬찬히 읽어 보면 별거 없습니다. 하나씩 해석 해보죠.

투입 할 값을 변수에 담기

Fields = Array("TradeDay", "StockID", "Price")
Values = Array("2017-03-14", "KOSPI200", "282.31")

Variant 로 선언된 FieldsValues 를 배열로 각각 값을 담습니다.

Fields 에는 각각의 Values 가 들어갈 필드 이름을, Values 에는 실제 투입 될 데이터를 담아 줍니다. 이 과정에서 딱 하나만 주의 하면 되요. 필드 이름 순서와 각 필드에 들어갈 값의 순서가 같아야 한다는 것. 사실 당연한 겁니다.

레코드셋을 열어서 조건에 맞는 데이터가 있는지 확인 하기

mySQL = "SELECT * FROM Stock_Price WHERE StockID='KOSPI200' AND TradeDay='2017-03-24'"
RS.Open mySQL

If RS.EOF Then
    RS.Addnew
    RS.Update Fields, Values
Else
    RS.Update Fields, Values
End If

예시에서는 우리가 집어 넣으려 하는 KOSPI200 의 2017년 3월 24일의 값이 테이블에 존재하는지 먼저 알아 봅니다.

그래서 데이터가 존재하지 않으면(RS.EOF) 레코드셋에 데이터가 들어갈 행을 추가 하고(RS.Addnew) 각 필드에 값을 넣어 줍니다(RS.Update Fields, Values).

만약 이미 데이터가 존재한다면, 그래도 그 데이터를 업데이트 해줍시다. 행 추가만 없이 그냥 업데이트(RS.Update Fields, Values) 해줍니다.

업데이트된 레코드셋을 DB에 반영하기

RS.UpdateBatch
RS.Close

이제 레코드셋을 실제 DB에 반영 시켜주고(RS.UpdateBatch) 작업이 끝난 레코드셋을 닫아 주면 됩니다(RS.Close).

쿼리문 작성 보다 편한점

이 방법이 직접 쿼리문을 작성하는 것보다 조금은 더 편합니다. 이 과정을 쿼리문으로 옮기려면 우선 데이터가 없을때는 Insert 문을, 데이터가 있다면 Update 문을 사용해야 하고, 필드 값이 많아질수록 정말 읽기 싫어지는 길이의 쿼리문이 작성 되기 때문에 위 방법이 훨씬 나아요.

참고 자료

UpdateUpdateBatch 의 차이가 궁금하다면 아래 링크를 참고해 주세요.

RecordSet 의 update 와 updatebatch 의 차이

끝.