Global It Leader!!



 
 

VB VB에서 MDB를 ADO로 연결하여 사용하기

페이지 정보

작성자 no_profile 오원장 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 댓글 0건 조회 6,575회 작성일 12-08-31 18:28

본문

아래 소스는 통채로 복사해서 모듈에 넣고 필드이름만 바꿔서 사용하시면 됩니다.

 

차근차근 설명 드리죠.

일단 메뉴에서

프로젝트 -> 참조

를 가셔서

Microsoft ActiveX Data Object Library 2.8 

Microsoft ADO Ext. 2.8 for DLL and Security

두 항목을 참조합니다.

위에것은 MDB 파일을 다루는데 필요한 참조이고 아래것은 MDB파일이 없을경우 MDB 파일을 생성하는데 필요한 참조입니다.

아래 소스는 MDB 파일이 없어도 자동으로 생성해서 사용이 가능하게 해줍니다.

 

다음 아래 소스 시작부터 소스 끝까지 모듈한개를 추가해서 붙여넣기 합니다.

소스 중간 중간 주석으로 설명을 넣겠습니다.

'====================== 소스 시작 ==========================

 

Option Explicit

Public Con As ADODB.Connection
Public Rs As ADODB.Recordset
Public MDB_Make As ADOX.Catalog  'MDB 파일을 만들기 위한 참조
Public DBPath As String
Public DBFile As String

Type DB_Type
    DB_Table As String
    DB_Field As String
End Type

Public DB_Gujo(100) As DB_Type  '100개의 테이블까지 생성할수 있도록 배열 갯수를 지정합니다. 원하시면 숫자를 늘리시면 됩니다.

 

'DB 내용을 초기화하는 부분으로 손대실 필요가 없습니다.

Private Sub DB_Init()
    Dim i As Integer
    For i = 0 To UBound(DB_Gujo)
        DB_Gujo(i).DB_Table = ""
        DB_Gujo(i).DB_Field = ""
    Next
End Sub

 

'디비를 번호별로 추가가 가능하게끔 설정하는 부분

'(이 부분(빨간색)을 원하시는대로 수정하셔야 합니다.)
Public Sub DB_Info()
    Dim X As String
    
    Call DB_Init  'DB를 초기화 합니다.
    
    '품목 테이블
    DB_Gujo(1).DB_Table = "BUY_PUMMOK"   '테이블 이름을 지정합니다.

    '각 필드들을 설정합니다.
    X = " [인덱스] int Identity Primary Key Not Null, "    '자동증가하는 프라이머리키 입니다.
    X = X + " [품목코드] varChar(15) Default """", "  '문자열입니다.
    X = X + " [품목명] varChar(100) Default """", "
    X = X + " [대분류] varChar(15) Default """", "
    X = X + " [규격] varChar(50) Default """", "
    X = X + " [중량] single Default 0, 
"   '소수점도 입력이 가능한 Single 형 필드입니다.
    X = X + " [단위] varChar(10) Default """", "
    X = X + " [입고수량] single Default 0, "
    X = X + " [출고수량] single Default 0, "
    X = X + " [계산방법] int Default 1, 
"  
'정수가 입력이 가능한 정수형필드 기본값은 1 입니다.

    X = X + " [구분] varChar(1) Default """", "
    X = X + " [메모] nText Default """", "
    X = X + " [임시] varChar(50) Default """" 
"  '문자열필드 선언뒤에 쌍따옴표가 네개가 더 붙은건 기본값을 빈 문자열로 넣어주기 위함입니다. 쌍따옴표 두개가 만들어진문자열내에서 쌍따옴표 한개 역할을 하기때문에 "" 이렇게 쓴 결과가 됩니다. '' 로 대체할수 없습니다.
    DB_Gujo(1).DB_Field = X  '위에서 작성한 문자열을 필드내용으로 담습니다.
    
    DB_Gujo(2).DB_Table = "BUY_CUSTOMER '두번째 테이블 입니다. 세번째를 만드실려면 
DB_Gujo(3).DB_Table 을 만드시면 됩니다.
    X = " [인덱스] int Identity Primary Key Not Null, "
    X = X + " [업체코드] varChar(15) Default """", "
    X = X + " [업체명] varChar(50) Default """", "
    X = X + " [사업자등록번호] varChar(20) Default """", "
    X = X + " [대표자] varChar(50) Default """", "
    X = X + " [우편번호] varChar(7) Default """", "
    X = X + " [사업장주소] varChar(200) Default """", "
    X = X + " [업태] varChar(30) Default """", "
    X = X + " [종목] varChar(30) Default """", "
    X = X + " [전화] varChar(50) Default """", "
    X = X + " [팩스] varChar(50) Default """", "
    X = X + " [홈페이지] varChar(100) Default """", "
    X = X + " [이메일] varChar(100) Default """", "
    X = X + " [지역코드] varChar(3) Default """", "
    X = X + " [담당자] varChar(10) Default """", "
    X = X + " [담당자연락처] varChar(16) Default """", "
    X = X + " [거래시작일] varChar(10) Default """", "
    X = X + " [거래종료일] varChar(10) Default """", "
    X = X + " [메모] nText Default """", "
    X = X + " [임시] varChar(50) Default """""
    
DB_Gujo(2).DB_Field = X

 

    '위와 같은 방법으로 테이블을 DB_Gujo(1), DB_Gujo(2), DB_Gujo(3) ... 식으로 만듭니다.

End Sub

 

'DB_info 에서 저장한 번호를 index 값으로 주면 해당 테이블을 만듦. (수정할 필요 없습니다.)
Public Sub Create_Table(index As Integer)
    Dim strSql As String
    '로그인 테이블 생성 (기본 1번 테이블)
    strSql = "CREATE Table " + DB_Gujo(index).DB_Table + "(" + DB_Gujo(index).DB_Field + ")"
    '쿼리문을 실행
    Call Con.Execute(strSql)
End Sub

 

'MDB 파일과 연결하는 함수입니다. 프로그램을 시작할때 한번만 실행해 주면 됩니다.

'이 함수는 연결이 성공하면 True를 실패하면 False를 반환합니다.

'오류가 나면 메시지를 내보내는데 이 메시지는 옵션으로 내보낼수도 안내보낼수도 있습니다.

'사용법 : Call DB_Conn_MDB 또는 Call DB_Conn_MDB(True)

'이 함수는 아래 빨간색 부분만 자신에게 맞게 고치시면 됩니다.

Public Function DB_Conn_MDB(Optional Msg As Boolean) As Boolean
    Dim sql As String
    Dim conStr As String
    Dim MsgMake As String
    Dim i As Integer
    
    DB_Conn_MDB = False  '일단 연결 실패로 설정
    
    'MDB일 경우 해당함.
    
    On Error GoTo ConnectError
    '접속 연결 문자열
    Set Con = New ADODB.Connection
    
    '파일의 경로(실행파일이 있는 위치 아래 MDB라는 폴더로 지정.
    DBPath = IIf(Right(App.Path, 1) = "\", App.Path, App.Path + "\") + "MDB\"
    '파일의 이름(사용자가 여기서 지정)
    DBFile = "SaveData.MDB"
    'DB 구조 불러옴
    Call DB_Info
    '연결 문자열 설정
    conStr = "Provider=Microsoft.Jet.OLEDB.4.0;"
    conStr = conStr + "Data Source=" + DBPath + DBFile + ";"
    conStr = conStr + "User ID=admin"

    'MDB 파일에 암호를 넣으려거나 있다면 아래줄을 활성화 시키고 암호를 입력하세요.
    'conStr = conStr + ";Jet OLEDB:Database Password=1111;"
    
    '파일이 있는지 검사
    If Not Dir(DBPath + DBFile) = "" Then
        '있으면 DB 연결 '각 테이블이 있는지 검사
        Con.Open conStr
        Set Rs = Con.OpenSchema(adSchemaTables)
        If Not (Rs.BOF Or Rs.BOF) Then
            For i = 1 To UBound(DB_Gujo)
                If Not Len(DB_Gujo(i).DB_Table) = 0 Then
                    sql = "Not"
                    Rs.MoveFirst
                    Do While Not Rs.EOF
                        If Trim(Rs("table_name")) = DB_Gujo(i).DB_Table Then
                            sql = "IS"
                            Exit Do
                        End If
                        Rs.MoveNext
                    Loop
                    If sql = "Not" Then Call Create_Table(i)  '테이블이 없을경우 생성함.
                End If
            Next
        End If
    Else
        'MDB 파일자체가 없다면 생성
        '디렉터리 검사
        If Dir(DBPath, vbDirectory) = "" Then
            '디렉터리 생성
            Call MkDir(DBPath)
        End If
        'DB 파일 생성
        Set MDB_Make = New ADOX.Catalog  '새 MDB 파일을 만들어냄.
        Call MDB_Make.Create(conStr)
        Set MDB_Make = Nothing
        'DB 파일에 연결
        Con.Open conStr  '파일이 새로 생성되었기 때문에 연결이 됨.
        'Table 생성 및 Field 생성
        For i = 1 To UBound(DB_Gujo)
            If Not Len(DB_Gujo(i).DB_Table) = 0 Then
                Call Create_Table(i)  '테이블을 생성
            End If
        Next
    End If
    On Error GoTo 0
    DB_Conn_MDB = True '모든게 잘 처리 되었으므로 True를 반환하고 함수를 종료함.
    Exit Function
ConnectError:   '위 함수 실행중 에러가 발생하면 이 부분으로 분기함.
    DB_Conn_MDB = False
    If Msg Then  '함수의 옵션값이 True 라면 메시지를 띄워줌.
        MsgMake = "DB에 문제가 발생하였습니다." + vbCrLf + vbCrLf _
            + "DB : " + DBPath + DBFile + vbCrLf _
            + "Error : "
        For i = 0 To Con.Errors.Count - 1

            '에러가 발생한 모든 내역을 보여줌.(에러번호와 내용.)
            MsgMake = MsgMake + "(" + CStr(Con.Errors(i).Number) + ") " + Con.Errors(i).Descript-xion
        Next
        MsgMake = MsgMake + vbCrLf + vbCrLf _
            + "DB를 점검후에 다시 시도 하세요."
        MsgBox MsgMake, vbCritical + vbOKOnly, "프로그램 오류"
    End If
End Function

 

'이 함수는 SQL 문장을 실행하는 함수로 제대로 실행되면 True를 , 실행에 실패하면 False 값을 돌려줍니다.

'사용법은 다음과 같습니다. Call Run(strSql) 또는 Call Run(strSql, True)

'위의 연결함수와 같이 에러 메시지를 나타나게 혹은 안나타나게 할수 있습니다.

Public Function Run(nSql As String, Optional Message As Boolean) As Boolean
    Dim MsgMake As String
    
    On Error GoTo ErrSql
    Set Rs = Con.Execute(nSql)
    On Error GoTo 0
    Run = True
    Exit Function
ErrSql:
    Run = False
    If Message Then
        MsgMake = "레코드셋을 가져오는데 실패하였습니다." + vbCrLf + vbCrLf _
            + "Sql : " _
            + nSql + vbCrLf
        MsgMake = MsgMake + vbCrLf _
            + "DB를 점검후에 다시 시도 하세요."
        MsgBox MsgMake, vbCritical + vbOKOnly, "프로그램 오류"
    End If
End Function


 

'====================== 소스 끝 ==========================

 

위 소스를 모듈에 붙여넣기 하고 테이블 정보와 파일정보 수정이 끝나셨다면 다음과 같이 사용하시면 됩니다.

 

폼의 Load() 부분이나 모듈의 Main() 함수에서

 

If Not DB_Conn_MDB Then

   Msgbox "DB와 연결되지 않아서 프로그램을 실행할 수 없습니다."

   End

End if

 

위와 같이 써주면 DB와 연결되지 않고서는 프로그램을 사용할 수 없게 됩니다.

DB_Conn_MDB 함수에서 연결을 시도하고 실패시 False 값을 돌려주기 때문에(오류 메시지는 기본적으로 나오지 않습니다.)

자신이 작성한 메시지박스를 내보내고 종료를 하게 되는 것이죠.

위 If 문만 넣어준다면 DB를 사용할 준비는 끝.

다음은 SQL문장을 실행하는 부분입니다.

연결을 하셨으면 자료를 가져와야겠죠?

다음은 품목테이블에서 계산방법이 1인 품목만 가져와 리스트 박스에 뿌리는 방법입니다.

 

strSQL = "Select * From BUY_POMMOK Where 계산방법 = 1"   'sql 문을 작성합니다.

List1.Clear   '리스트박스를 청소하구요.

If Run(strSQL) Then   'sql 문을 실행합니다. 이때 sql 문장이 틀려서 오류가 날경우는 False 값이 나오기 때문에 If문 안쪽은 실행되지 않습니다

    if Not (Rs.Eof or Rs.Bof) Then  'sql 문장을 실행하는데 성공했다면 레코드가 BOF이거나 EOF인지 확인합니다. 둘중 한개라도 만족한다면 레코드가 없다는 뜻입니다. 그러면 보여줄 레코드가 없기때문에 IF문 안쪽을 실행할 필요가 없습니다.

       Rs.MoveFirst   '레코드가 한개라도 있으면 제일 첫 레코드로 이동합니다.

       Do while not Rs.Eof   '처음부터 레코드가 끝날때까지 루프를 돕니다.

              List1.AddItem (Rs("품목명") & "")   '읽을 레코드를 리스트박스에 추가합니다.

              Rs.MoveNext  '다음 레코드로 이동합니다.

       Loop

    else

       '이부분에는 레코드가 없을때 취해야할 동작을 입력하세요.

    End if

else

    '이부분에는 sql문장이 잘못되었을때 취해야할 동작을 입력하세요.

End if

 

위와 같은 방법으로 DB에서 품목리스트를 만들어 보았습니다.

조금 복잡해 보이는거 같긴 하지만 간단한 원리 입니다.

연결만 성공하면 어디서든지 Sql 문장을 작성하시고 Run(Sql) 해주시면 결과가 Rs 에 나오게 됩니다.

Select 말고도 Insert, Update, Delete 뭐든 작성만 하면 됩니다.

위처럼 사용하시면 규모가 작은, DB 파일 한개만 쓰는 프로그램은 거의 모두 카바가 됩니다.

주절주절 도움이 되셨나 모르겠네요.

[이 게시물은 오원장님에 의해 2013-02-28 16:41:58 오피스팁에서 이동 됨]

댓글목록

등록된 댓글이 없습니다.

전체 440
게시물 검색
컴퓨터언어 목록
번호 제목 글쓴이 조회 날짜
200 VB no_profile 오원장 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 8250 07-08
199 VB no_profile 오원장 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 9307 07-05
198 VB no_profile 오원장 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 8800 07-04
197 VB no_profile 오원장 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 8873 07-02
196 VB no_profile 오원장 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 8092 07-01
195 VB no_profile 오원장 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 4866 10-29
194 VB no_profile 오원장 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 5320 08-31
193 VB no_profile 오원장 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 10434 08-31
192 VB no_profile 오원장 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 5280 08-31
열람중 VB no_profile 오원장 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 6576 08-31
190 VB no_profile 오원장 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 7000 08-29
189 VB no_profile 오원장 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 4827 08-29
188 VB no_profile 오원장 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 5711 08-24
187 VB no_profile 오원장 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 5148 08-09
186 VB no_profile 오원장 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 6008 08-09
185 VB no_profile 오원장 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 5576 04-07
184 VB no_profile 오원장 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 13227 01-07
183 VB no_profile 오원장 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 7347 12-01
182 VB no_profile 오원장 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 7477 04-08
181 VB no_profile 오원장 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 9552 04-08