강좌 > 엑셀에서 Database사용하기 > 14강 - VBA로 Oracle DB Server에 연결하여 Data처리하기(ADO를 이용하여 조회,추가,수정,삭제)

14강 - VBA로 Oracle DB Server에 연결하여 Data처리하기(ADO를 이용하여 조회,추가,수정,삭제)

14강에서는 VBA로 Oracle DB Server DB에 연결하여 Data를 조회,추가,수정,삭제하는 작업을 해 보고자 한다.

Oracle은 다른 DB에 비해서 연결이 까다롭다.Oracle Client설치를 잘못하거나 설정을 잘못하면 연결이 안되어 연결방법을 찾느라 고생할 수도 있으므로 아래 순서대로 차근차근 따라해 보자. 그러나 각자 PC의 OS 종류 및 버전, Oracle의 서버의 버전, 구성방식 등이 차이가 있을 수 있고 이 때문에 연결방법이 약간씩 다를 수 있다. 만약 연결이 안될때는 아래에 따로 적은 Trouble shooting부분을 참고하기 바란다.

1. 기능을 구현하기 전에 작업해야 할 것

  1. Oracle Client설치 : Oracle 홈페이지(http://www.oracle.com)에서 Oracle client프로그램을 다운로드 해서 설치한다. 설치 PC의 Windows OS가 32비트이면 32비트 client프로그램을 다운로드 해야 하고 64비트이면 64비트 client프로그램을 다운로드 해야 한다.Login계정이 없다면 만들어야 한다. 설치시 설치유형을 선택하게 되어 있는데 "Instant client" 옵션은 선택하지 않는다. 이 옵션을 선택하면 TNS를 등록하는 프로그램(Oracle Net Configuration Assistant)이 설치되지 않는다. 어느 것을 설치해야 할지 잘 모르겠다면 관리자 또는 런타임 옵션을 선택해서 설치를 진행한다.
  2. TNS 서비스 등록 : 프로그램 목록에서 Oracle Net Configuration Assistant를 실행하여 TNS서비스를 등록한다. "로컬네트 서비스 이름 구성" 옵션을 선택하여 등록한다.
  3. ODBC에서 DSN등록 : DSN을 이용하여 DB에 연결할 경우에만 필요하다. 내 PC의 OS의 종류에 맞게 ODBC프로그램을 실행해서 DSN을 등록해야 하는데 만약 OS가 64비트이면 64비트 ODBC를 실행해서 등록한다. DSN은 시스템DSN 또는 사용자DSN으로 등록하면 되는데 두개는 기능적으로 동일하다. 사용자DSN은 시스템에 로그인한 사용자만 사용할 수 있으며 시스템DSN은 로그인 사용자에 관계없이 보고, 사용할 수 있다. 각자 업무환경을 고려하여 둘 중에 하나를 선택하면 된다.

 

2. 간단한 조회기능으로 먼저 개념 익히기

DB를 연결하고 처리하는 기본 개념을 익히기 위해 다음과 같이 Excel sheet에 Data를 출력하는 간단한 기능을 먼저 구현해 보자.

getting data from database to excel sheet
Database에서 Data를 가져와서 Excel sheet에 출력

 

1) Table 생성

Oracle DB Server가 설치되어 있다고 가정하고 다음의 SQL로 테스트용 Table을 생성하자.

CREATE TABLE users (
    deptname varchar2(50) NOT NULL,
    username varchar2(50) NOT NULL,
    id int NOT NULL  PRIMARY KEY,
    salary float NOT NULL    
);

조회에 필요한 데이터는 INSERT SQL을 수행하여 각자 입력한다.

 

2) VBA에서 소스입력

VBA Module에 다음의 소스코드를 입력한다. Oracle DB Server에서 Data를 가져와서 Excel sheet에 필드명과 Data를 출력하는 기능이다. 소스코드에 대한 설명은 주석에 달아 놓았다.

'//Oracle Database Server에서 Data를 가져와서 Excel sheet에 출력하기
Sub test()

Dim conn As ADODB.Connection
Dim rs As New ADODB.Recordset
Dim strSQL As String
Dim i As Integer
    
    
    '//엑셀 Sheet에서 기존 조회내용 지우기
    Sheets("출력").Select
    Rows("1:1").Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.Delete shift:=xlUp

           
    Set conn = New ADODB.Connection
           
    '//Oracle DB에 연결하기 위해서는 여러가지 방법이 있을 수 있으나 여기에서는 ODBC 또는 OLEDB를 이용하여 연결문자열을 만든다.
    
    '====================================================================================================
    '//1. ODBC를 이용하여 연결
    '//각자 사정에 맞는 방식을 사용하면 된다.
    '///참고 사이트 - https://docs.oracle.com/database/122/ADFNS/odbc-driver.htm#ADFNS1188
    
    '// 방식1.1 : DSN을 이용하여 연결
    conn.ConnectionString = "DSN=TEST_DSN_ORA;Uid=test;Pwd=x1234;"
    
    '// 방식1.2 : DSN이용안함, TNS NAME은 있어야 함
    'conn.ConnectionString = "DRIVER={Oracle in OraClient11g_home2};UID=test;PWD=x1234;DBQ=XE;DBA=W;"
    
    '//ODBC 연결문자열에 들어가는 각각의 Keyword의 의미는 다음과 같다. 각자 환경에 맞도록 값을 수정한다.
    '//--------------------------------------------------------------------------------------------------
    '// DRIVER : ODBC Driver이름, Windows에서 ODBC를 실행하여 사용자DSN이나 시스템DSN 탭에서 추가버튼을 누르면 Driver의 이름을 확인할 수 있다.
    '// DSN : ODBC설정에서 등록하는 Data source명(Data Source Name)
    '// UID : DB에 Login하는 User ID
    '// PWD : Password
    '// DBQ : TNS Service Name(Oracel Client를 설치하고 Net Configuration Assistant를 실행하여 등록하는 로컬네트 서비스이름)
    '// DBA : Database Attribute(W=write access, R=read-only access)

    
    '====================================================================================================
    '//2. OLEDB를 이용하여 연결
    '// 방식2.1 : OLEDB를 이용하여 연결, TNS NAME은 있어야 함
    'conn.ConnectionString = "Provider=OraOLEDB.Oracle;Data Source=XE;User Id=test;Password=x1234;"
    
    '// 방식2.2 : OLEDB를 이용하여 연결, TNS NAME 사용안함.
    'conn.ConnectionString = "Provider=OraOLEDB.Oracle;" & _
                            "Data Source=(DESCRIPTION=(CID=GTU_APP)(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)" & _
                            "(HOST=192.168.99.199)(PORT=1521)))(CONNECT_DATA=(SID=XE)(SERVER=DEDICATED)));" & _
                            "User Id=test;Password=x1234;"

    '//OLEDB 연결문자열에 들어가는 각각의 Keyword의 의미는 다음과 같다. 각자 환경에 맞도록 값을 수정한다.
    '//--------------------------------------------------------------------------------------------------
    '// Provider : OLEDB 공급자명, Oracle은 "OraOLEDB.Oracle"을 사용
    '// Data Source : TNS를 이용하는 경우에는 TNS Service Name(Oracel Client를 설치하고 Net Configuration
    '//               Assistant를 실행하여 등록하는 로컬네트 서비스이름)을 기입하고 TNS를 이용하지 않으면
    '//               HOST에 Oracle DB 서버IP, PORT에 DB PORT번호(default:1521) SID에 Oracle SID를 입력한다.
    '// User Id : DB에 Login하는 User ID
    '// Password : Password

    
    '//Database Connection을 Open한다.
    conn.Open
   
    Set rs = New ADODB.Recordset
    rs.CursorLocation = adUseClient
    
    
    '//조회할SQL을 문자열로 만든다.
    strSQL = "SELECT deptname,username,id,salary" & _
           "  FROM users " & _
           " WHERE id > 0 "
           
    
    '//Database에서 Data를 가져온다.
    rs.Open Source:=strSQL, ActiveConnection:=conn, CursorType:=adOpenForwardOnly, LockType:=adLockReadOnly, Options:=adCmdText
           
    '//Database에서 Data를 가져와서 Data가 있으면 Excel sheet에 출력한다.
    If rs.EOF Then
        MsgBox "조회조건에 해당하는 자료가 없습니다."
    Else
    
        '//users Table의 필드명을 가져와서 Excel sheet에 첫행에 표시한다.
        For i = 0 To rs.Fields.Count - 1
          Cells(1, i + 1).Value = rs.Fields(i).Name
        Next
    
        '//첫번째 레코드로 이동한다.
        rs.MoveFirst
        
        '//조회한 결과집합(rs)을 "출력"Sheet의 A2지점을 꼭지점으로 해서 출력한다.
        With ActiveSheet
           .Range("A2").CopyFromRecordset rs
        End With
        
    End If
                
    '//Recordset개체와 Connection개체의 연결을 닫는다.
    rs.Close
    conn.Close
    
    '//Recordset개체와 Connection개체를 소멸시킨다.
    Set rs = Nothing
    Set conn = Nothing
    
End Sub

 

3. Data 조회,추가,수정,삭제 기능 구현

아래 그림과 같이 VBA Form을 이용하여 DB의 Data를 조회,추가,수정,삭제 하는 기능이다. Excel sheet에 있는 버튼을 클릭하면 Form이 나타나고 각각의 버튼을 클릭했을때 Data를 처리하는 기능이다. VBA프로그램코드는 첨부의 파일을 참고하기 바란다.

  • 조회기능 : Form에서 조회버튼을 누르면 Database에서 Data를 가져와서 Form에 조회한다.
  • 저장기능 : Form에서 저장버튼을 누르면 Database에 Data를 추가(Insert)하거나 수정(Update)한다.
  • 삭제기능 : Form에서 삭제버튼을 누르면 Database에서 Data를 삭제(Delete)한다.

 

※ Trouble Shooting

첨부의 VBA프로그램을 다운로드 받아서 필요한 부분을 작업하고 각자 환경에 맞게 VBA을 수정하여 실행하여도 에러가 나면 아래의 케이스를 확인해 보자.

  • "TNS:지정된 접속 식별자를 분석할 수 없음" 에러 발생시 : VBA프로그램 연결문자열 만들때 TNS서비스 이름을 잘못 입력했는지 확인해 본다. "DBQ=" 다음에 입력하는 값이다.
  • "[ODBC 드라이버 관리자] 지정된 DSN은 드라이버와 응용 프로그램 간 아키텍처 불일치를 포함합니다" 에러 발생시 : OS의 종류와 설치된 ODBC드라이버의 종류가 다르기 때문에 발생한다. 예를 들면 64비트 운영체제에서 32비트 ODBC를 사용하면 오류가 발생한다. OS의 종류에 맞는 Oracle client다운로드해서 설치해야 한다.
  • "ORA-12170:TNS:접속 시간 초과가 발생함" 에러 발생시 : Oracle DB가 살아있는 지 확인한다. Down되었을 때 나타날 수 있는 에러메시지이다.
  • [ODBC 드라이버 관리자] 데이터 원본 이름이 없고 기본 드라이버를 지정하지 않았습니다" 에러 발생 시 : DB연결문자열이 잘못되었을 수 있다. 예를 들면 Driver명을 잘 못 지정하거나 DSN명이 틀리면 이 에러가 발생할 수 있다. Windows에서 ODBC를 실행하여 DSN명이 정확한 지 확인해보고 DSN명이 정확하다면 사용자DSN이나 시스템DSN 탭에서 추가버튼을 눌러서 Driver의 이름을 확인한다. DB연결문자열에 있는 Driver명과 ODBC설정에 있는 Driver명은 동일해야 한다.

위의 방법으로 해결이 되지 않는다면 Oracle에서 제공하는 아래의 ODBC Driver 개발가이드를 참고한다.
https://docs.oracle.com/database/122/ADFNS/odbc-driver.htm

 

이상으로 14강을 마친다. 구체적인 기능은 첨부의 실습용 파일을 참고하기 바라며, 이 프로그램은 Database프로그램의 구조를 쉽게 이해할 수 있도록 하기 위해서 만든 것이므로 실제로 사용하기에는 비효율적인 부분이 많다, 실제 업무에 적용시에는 입력Data의 Validation, DB연결을 공통기능으로 만든다든지 하는 추가적인 노력이 필요함을 알려둔다.

 

[ 엑셀에서 Database사용하기 강좌 목록 ]

 

엑셀웍스 책 출간 안내

그동안 엑셀웍스에 올린 '엑셀 강좌', '함수 사용법', 여러 '실무 예제'에서 핵심만 뽑아 '된다! 엑셀 수식 & 함수' 책으로 출간하였습니다.

엑셀웍스 책 출간안내  자세히 보기

온라인 구매처: 예스24   교보문고   알라딘 

“14강 - VBA로 Oracle DB Server에 연결하여 Data처리하기(ADO를 이용하여 조회,추가,수정,삭제)”의 7개의 댓글

  1. 진해식

    OLEDB로 Oracle 연결하는 방식을 알려주실 수 있는지요?

    환경 : 오라클 클라이언트 11g 및 tnsname 설정완료

    감사합니다.

  2. 안녕하세요. VBA로 오라클 연결해서 자동화를 사용하고 있는 사용자입니다.
    DSN에 Oracle in instantclient 추가해서 사용하고있는데, 제 자리에서는 잘 작동이 되는데 옆 동료자리에서는 작동이 안되는 이유가 무엇일까요..?

    DSN 추가할때 Test Connection도 성공했다 뜨고, 코드 중
    If cnn.State = adStateOpen then MsgBox("Connect") 이부분에서 Connect 라고 표시됩니다.

    delete 문같은걸 써도 Oracle에 반영이 안되는거 보면
    뭔가 포면상으로만 접속이 됐다고 표시되고, 실제로는 접속이 안된거 같은 느낌이 드는데..
    왜그러는걸까요ㅠㅠ

    1. DB접속하고 처리하는 과정에서 안되는 이유는 여러가지라서 뭐라고 말씀드리기 어렵네요. DELETE문 대신에 SELECT해서 실제로 값을 가져오는지 먼저 확인해보면 좋을 것 같습니다.

      1. 답변 감사합니다. select해서 실제값을 가져오는것도 안되더라구요ㅠㅠ
        기본베이스 없이 필요한거만 그때그때 찾아만들다보니 자동화의 길이 어렵네요.

        추가로 질문 드리면
        - 1. 기능을 구현하기 전에 작업해야 할 것 이부분에서
        다른 서버에 있는 Oracle을 접속할때는 해당 서버의 IP, 포트, 계정ID, 패스워드를 알고있다면,
        1. Oracle Client설치, 2.TNS 서비스 등록 이 부분은 생략해도 되는걸까요?

        - ODBC에서 DSN 등록할때 프로그램을
        https://www.oracle.com/kr/database/technologies/instant-client/winx64-64-downloads.html
        해당 사이트에서
        Basic Package, Visual Studio 2017 Redistributable, ODBC Package 이렇게 다운 받았는데 혹시 더
        필요한 파일이 있을까요??

        1. 안녕하세요.
          Oracle Client는 생략해도 되구요, TNS는 연결을 위한 것이니 필요할 것 같네요. 다운로드는 ODBC Package만 하면 될것 같은데요.

댓글 남기기

Scroll to Top