[ADODB] DB에서 데이터를 삭제하는 방법

  1. ADODB 에서 데이터를 삭제 하기 위해서는,
  2. 레코드셋의 Delete 메소드를 사용하거나,
  3. 쿼리문에서 Delete 명령어를 사용하면 됩니다.
  4. 근데 항상 조건을 잘 걸었는지 확인하세요. 잘 못 하면 데이터 다 날리니까.

DB 에서 데이터를 삭제 하는 방법은 두가지가 있습니다. 그 첫번째는 쿼리를 통한 방법이고, 두번째는 레코드셋의 .Delete 메소드를 이용하는 방법입니다.

두 가지 방법을 알아보기 전에 DB의 테이블에서 데이터를 삭제 하는 것은 항상 조심스럽기 때문에 항상 꼼꼼히 쿼리를 짜고, 메소드를 잘 쓰든지 해야함을 명심합시다.

아래는 쿼리와 레코드셋 메소드를 이용해서 데이터를 삭제 하는 방법입니다.

쿼리를 사용한 데이터 삭제

쿼리를 사용해서 데이터를 삭제 하기 위해서는 Delete 문을 사용하면 됩니다.

Dim mySQL as String

mySQL = "DELETE FROM STOCKPRICE WHERE STOCKID='KOSPI200' AND TRADEDATE='2017-04-04'"

DB.Execute mySQL

쿼리문 해석

위 쿼리는 STOCKPRICE 테이블에서 STOCKIDKOSPI200 이고 TRADEDATE2017-04-04 인 데이터를 삭제하라는 것을 의미합니다. 추가적으로 아랫부분의 DB 는 현재 연결되어 있는 커넥션을 의미 합니다.

주의할 것

쿼리가 생각보다 복잡하지는 않지만, 만에하나 TRADEDATE 조건을 빼먹으면 STOCKIDKOSPI200 으로 쌓여 있던 시계열 데이터가 모두 삭제되는 불상사가 발생 할 수 있으니 주의 해야 합니다.

아주 만약에 해당 조건을 만족하는 데이터가 존재하지 않을 수 있으므로 먼저 SELECT 문을 이용해 조회 해보고, EOF 가 아닐 경우에 DELETE 문을 실행 하는 것이 좋습니다.

레코드셋 메소드를 이용한 데이터 삭제

레코드셋의 .DELETE1 메소드를 이용한 삭제 방법은 아래와 같습니다.

Dim RS as New ADODB.RecordSet

With RS
    .Open "STOCKPRICE"
    .Filter = "STOCKID='KOSPI200' AND TRADEDATE='2017-04-04'"

    IF .RecordCount > 0 Then
        .Delete
        .UpdateBatch
    End If
End With

메소드 활용 예시 해석

위 과정을 풀어서 이야기 하자면 다음과 같습니다.

  1. RS 라는 레코드셋에서
  2. 이름이 STOCKPRICE 라는 테이블을 열고(Open)
  3. 해당 테이블에서 STOCKIDKOSPI200 이고, TRADEDATE2017-04-04 인 데이터를 필터링 한 후(Filter)
  4. 해당 필터링으로 걸러진 데이터가 1개 이상일 경우(RecordCount)
  5. 삭제하고(Delete)
  6. DB에 반영 함(UpdateBatch)

주의할 점

쿼리를 이용한 방법과 마찬가지로 해당 데이터가 존재 하는지 먼저 확인 후 데이터를 삭제 하는 것이 좋습니다. 예제에서는 .RecordCount > 0 이라는 부분에서 확인 작업을 실시 했습니다.

레코드셋에서 삭제한 내용을 꼭 DB에도 반영시켜주어야 합니다. 예제에서 UpdateBatch2 를 사용한 부분입니다.

Delete 메소드의 파라미터

예제에서는 사용하지 않았지만, Delete 메소드는 파라미터를 이용 할 수 있습니다. 아래가 바로 Delete 문에 사용 할 수 있는 파라미터 입니다.

from w3school.com

두 가지를 넣을 수 있는데요. 각각 다음과 같은 의미를 가집니다.

  • adAffectCurrent: 레코드셋의 현재 데이터만 삭제
  • adAffectGroup: Filter 를 통해 조회된 레코드셋 전체를 삭제

만약 Filter 를 통해 1개의 데이터만 조회 되었다면 두 파라미터를 통한 Delete 메소드 실행은 차이가 없겠지만, 2개 이상의 데이터가 조회 되었다면 이야기가 달라집니다.

adAffectCurrent 를 사용하였다면 2개 이상의 데이터가 들어 있는 레코드셋에서 현재 포커스가 맞춰진 데이터만 삭제하게 될 것이고, adAffectGroup 을 사용하면 레코드셋에 있는 모든 데이터가 삭제 됩니다.


쿼리를 쓰든, 메소드를 쓰든, 상황에 맞게 잘 사용해야 할 것입니다.

쓰다보니 엄청 길어졌네요.

끝.