본문 바로가기
VB

[VB 6.0] 스프레드와 DB 연결하기

by 엘딘 2022. 5. 4.
Spread 생성

1. 스프레드 도구 추가

 도구 상자 > 오른쪽 마우스 > 구성요소 > FarPoint Spread 6.0 확인

 

2. Spread 생성 후 > Spread 우클릭 > Spread Designer 클릭

왼쪽 - 열 제목 설정

오른쪽 - 행,열 최대개수 / 열 ID 설정

 

열,행 최대 개수 / 열 ID설정

 

 

DB 연결

1. 프로젝트 탭 > 참조 > Microsoft ActiveX Data Objects 6.1 Library 체크 > 확인

2. Sql 연결

 

3. 모듈에 코드 추가 

Public Sub ExecuteDB(ByVal rsIP As String, ByVal rsCatalog As String, ByVal rsUser As String, ByVal rsPwd As String, ByVal rsqlStr As String, ByRef iCnt As Integer)
    On Error GoTo err
    
    Dim AdoCn As New ADODB.Connection
    
    '상단에 프로젝트의 참조를 들어가서 Microsoft ActiveX Data Objects 2.8 Library를 체크 그래야 데이터 베이스에 접근 가능
    
    With AdoCn
        .ConnectionTimeout = 3
        
        'DB연결(모듈은 모든 폼에서 동일하게 적용하기 때문에 특정 ip를 입력할 순 없다)
        .Open "Provider=sqloledb;Data Source=" & rsIP & ";Database=" & rsCatalog & ";UID=" & rsUser & ";PWD=" & rsPwd
        
        .Execute rsqlStr, iCnt
    
        .Close             '연결 종료
    End With
err:
    If err <> 0 Then
        MsgBox ("오류:" & err.Description)
    End If
End Sub

 

Public Sub GetDBData(ByVal rsIP As String, ByVal rsCatalog As String, ByVal rsUser As String, ByVal rsPwd As String, ByVal rsqlStr As String, ByRef rsRet)        '데이터베이스의 값을 가져와서 스프레드에 뿌리기
    On Error GoTo err
    
    Dim MyConnObj As New ADODB.Connection
    Dim myRectSet As New ADODB.Recordset
    Dim i As Integer
    
    '상단에 프로젝트의 참조를 들어가서 Microsoft ActiveX Data Objects 2.8 Library를 체크 그래야 데이터 베이스에 접급 가능
    MyConnObj.Open "Provider=sqloledb;Data Source=" & rsIP & ";Database=" & rsCatalog & ";UID=" & rsUser & ";PWD=" & rsPwd
    
    myRectSet.Open rsqlStr, MyConnObj        '쿼리 날리기
    
    If myRectSet.EOF = True Then
    Else
        ' 첫번째: ?,  2번째 -1: 모든 데이터 , 3번째 Chr(124): 각 열을 Chr(124)로 구분해줌, 4번째 Chr(3): 각 행을 Chr(3)으로 구분
        rsRet = myRectSet.GetString(adClipString, -1, Chr(124), Chr(3))
    End If

''    If myRectSet.RecordCount <> 0 Then   '셀렉트해서 값이 있으면
''        Do While Not myRectSet.EOF '목록 끝까지 불러오기
''            rsRet = rsRet & myRectSet.Fields(0) & Chr(124)
''            rsRet = rsRet & myRectSet.Fields(1) & Chr(124)
''            rsRet = rsRet & myRectSet.Fields(2) & Chr(124)
''            rsRet = rsRet & myRectSet.Fields(3) & Chr(124)
''            rsRet = rsRet & myRectSet.Fields(4) & Chr(124) & Chr(3)
''
''            myRectSet.MoveNext  '값 하나 받고 다음으로 넘어가는거
''        Loop
''    End If

    MyConnObj.Close             '연결 종료
    
err:
    If err <> 0 Then
        MsgBox ("오류:" & err.Description)
    End If
End Sub

 

 

* IP연결할때 Port가 1433인 이유?

기본 Default값으로 1433이 설정되어있고 보안을 위해서 다른 Port로 바꿔주면 된다

 

 

 

폼 로드
Private Sub Form_Load()
    Dim sRet As String
    Dim sSql As String
    Dim i As Integer
    Dim j As Integer
    
    Dim aTest() As String
    Dim aTest2() As String
    Dim sInput As String
    
    '' 행 개수 0개로 시작
    spread.MaxRows = 0
    
    '' DB SELECT문(폼을 열었을때 DB데이터 가져오기) 
    sSql = "select * from Member"
    
    '' DB와 연결
    '' sRet Spread에 있는 모든 데이터를 담고 있음
    '' sRet는 행은 chr(3), 열은 chr(124)로 구분하고 있음
    Call GetDBData("127.0.0.1,1433", "ACKTEST", "sa", "ackif", sSql, sRet)
    
    
    '' Chr(3)은 Split으로 나눌떄 문자가 아니므로 ""로 묶어주지 않는다
    '' 먼저 Chr(3)으로 나눠 행별로 배열에 담아준다
    aTest() = Split(sRet, Chr(3))
    
    
    'For i = LBound(a) To UBound(a)
        
    For i = 0 To UBound(aTest) - 1
        If aTest(i) <> "" Then
            aTest2() = Split(aTest(i), Chr(124))
            
            spread.MaxRows = spread.MaxRows + 1
            
            Call spread.SetText(spread.GetColFromID("Id"), spread.MaxRows, aTest2(0))
            Call spread.SetText(spread.GetColFromID("Name"), spread.MaxRows, aTest2(1))
            Call spread.SetText(spread.GetColFromID("Age"), spread.MaxRows, aTest2(2))
            Call spread.SetText(spread.GetColFromID("Address"), spread.MaxRows, aTest2(3))
            Call spread.SetText(spread.GetColFromID("Gender"), spread.MaxRows, aTest2(4))
        End If
    Next i

End Sub

 

추가버튼
Private Sub addBtn_Click()
    On Error GoTo err
    
    Dim sSql As String
  
    With spread

        .MaxRows = .MaxRows + 1

        ' GetColFromID는 텍스트박스와 스프레드 열을 연결하기 위해서 열의 id를 가져옴
        Call .SetText(.GetColFromID("Id"), .MaxRows, idtxt.Text)
        Call .SetText(.GetColFromID("Name"), .MaxRows, nameTxt.Text)
        Call .SetText(.GetColFromID("Age"), .MaxRows, ageTxt.Text)
        Call .SetText(.GetColFromID("Address"), .MaxRows, addressTxt.Text)
        Call .SetText(.GetColFromID("Gender"), .MaxRows, genderTxt.Text)

    End With
    
err:
    If err <> 0 Then
        Call MsgBox(err.Description)
    End If
End Sub

 

삭제버튼
Private Sub deleteBtn_Click()
    On Error GoTo err
    
    Dim i As Integer
    Dim sSql As String
    Dim sId As String
    Dim vTmp
    Dim iCnt As Integer
    
    With spread
        For i = 1 To .MaxRows
            .Col = .GetColFromID("CheckBox")
            .Row = i
            
            If .Text = "1" Then
                ' vTmp는 var값이 들어가야하므로 형식없이 선언
                ' vTmp는 value로 getColFromID("id")를 통해 가져온 id(데이터)를 vTmp에 넣어준다(파라미터)
                Call .GetText(.GetColFromID("Id"), i, vTmp)
                ' sID는 vTmp에 혹시나 있을 공백을 제거해준 파라미터
                sId = Trim(vTmp)
                
                .Row = i
                .Action = 5

                'ex_ 10행까지 있고 i=7일 경우 7번째 행의 데이터는 지워지고 7행은 빈칸으로 남아 있다. 여기서 Action=5와 .MaxRows = .MaxRows -1를 통해 행을 지우면 끝 행이 지어지므로 10행이 지워진다.
                ' 고로 이러한 오류를 없애기 위해 i를 하나씩 줄여줌으로써 8행 데이터가 7행으로 10행 데이터가 9행에 가도록 해준 후 마지막 행을 지워주는 역할
                i = i - 1
                
                .MaxRows = .MaxRows - 1
            End If
            
            'sSql = DELETE/ FROM Member
            ' primary key인 열을 기준으로 삭제
            sSql = "DELETE FROM Member WHERE ID = '" & sId & "'"
        
            Call ExecuteDB("127.0.0.1,1433", "ACKTEST", "sa", "ackif", sSql, iCnt)
        
        Next i
        

    End With
    
err:
    If err <> 0 Then
        Call MsgBox(err.Description)
    End If
End Sub

 

수정버튼
Private Sub updateBtn_Click()

    On Error GoTo err
    
    Dim sSql As String
    Dim iCnt As Integer
    Dim i As Integer
    
    ' aId, aName, aAge, aAddress, aGender값은 String이 아님!!!
    Dim aId, aName, aAge, aAddress, aGender
    Dim sId, sName, sAge, sAddress, sGender As String
    
    With spread
    
        For i = 1 To .MaxRows
            
            .Col = .GetColFromID("CheckBox")
            .Row = i
        
             If .Text = "1" Then
            
            	' i번째 행의 ID 열의 값을 aId에 넣어줌
                Call .GetText(.GetColFromID("Id"), i, aId)
                Call .GetText(.GetColFromID("Name"), i, aName)
                Call .GetText(.GetColFromID("Age"), i, aAge)
                Call .GetText(.GetColFromID("Address"), i, aAddress)
                Call .GetText(.GetColFromID("Gender"), i, aGender)
                
                sId = Trim(aId)
                sName = Trim(aName)
                sAge = Trim(aAge)
                sAddress = Trim(aAddress)
                sGender = Trim(aGender)
        
        
''                Call .SetText(.GetColFromID("Id"), i, idtxt.Text)
''                Call .SetText(.GetColFromID("Name"), i, nameTxt.Text)
''                Call .SetText(.GetColFromID("Age"), i, ageTxt.Text)
''                Call .SetText(.GetColFromID("Address"), i, addressTxt.Text)
''                Call .SetText(.GetColFromID("Gender"), i, genderTxt.Text)
        
                ' query문 작성할 시 줄바꿈 사용하려면 &_를 사용
                sSql = "UPDATE Member " & _
                       "Set Id = '" & sId & "', Name = '" & sName & "', Age = '" & sAge & "', Address = '" & sAddress & "', Gender = '" & sGender & "'" & _
                       "WHERE ID = '" & sId & "'"

                '폼마다 다른 DB에 접근하기 위해 접근할 DB의 주소를 입력(포트 사용 이유 : ip는 알 수 있으니 포트를 사용함으로써 보안)
                Call ExecuteDB("127.0.0.1,1433", "ACKTEST", "sa", "ackif", sSql, iCnt)

            End If
        Next
    End With
    
err:
    If err <> 0 Then
        Call MsgBox(err.Description)
    End If
        
End Sub

 

 

저장버튼
Private Sub saveBtn_Click()
    On Error GoTo err
    
    Dim sSql As String
    Dim iCnt As Integer
    Dim i As Integer
    Dim aId, aName, aAge, aAddress, aGender
    Dim sId, sName, sAge, sAddress, sGender As String

    With spread
        
        For i = 1 To .MaxRows
        
            .Col = .GetColFromID("CheckBox")
            .Row = i
        
             If .Text = "1" Then
        
                Call .GetText(.GetColFromID("Id"), i, aId)
                Call .GetText(.GetColFromID("Name"), i, aName)
                Call .GetText(.GetColFromID("Age"), i, aAge)
                Call .GetText(.GetColFromID("Address"), i, aAddress)
                Call .GetText(.GetColFromID("Gender"), i, aGender)
                
                sId = Trim(aId)
                sName = Trim(aName)
                sAge = Trim(aAge)
                sAddress = Trim(aAddress)
                sGender = Trim(aGender)
                     
                ' values에서 값을 idtxt만 적은 이유는 스프레드와 같이 열이 아닌 DB열과 values 값만 일치시켜주면 되기때문에
                ' 문자를 입력할 시 작은 따옴표(')로 묶어준다 , 값의 경우 ""밖에 적어줘야함으로 &로 연결시켜준다
                sSql = "INSERT INTO Member(ID, Name, Age, Address, Gender) values ('" & sId & "', '" & sName & "', '" & sAge & "', '" & sAddress & "', '" & sGender & "')"
                
                '폼마다 다른 DB에 접근하기 위해 접근할 DB의 주소를 입력(포트 사용 이유 : ip는 알 수 있으니 포트를 사용함으로써 보안)
                Call ExecuteDB("127.0.0.1,1433", "ACKTEST", "sa", "ackif", sSql, iCnt)
            End If
        Next
    End With
    
err:
    If err <> 0 Then
        Call MsgBox(err.Description)
    End If
End Sub

'VB' 카테고리의 다른 글

[VB.NET] 엑셀 파일 생성  (0) 2022.05.12
[VB.NET] Excel 연결  (0) 2022.05.12
[C#] 숫자를 한글로 표현  (0) 2022.05.11
[Vb6.0] Byval / Byref  (0) 2022.05.06
[VB6.0] 계산기  (0) 2022.05.03

댓글