2024. 2. 15. 11:08ㆍVB.NET/MS-SQL
이번 시간에는 지난 시간에 이어서 EntityFrameworkCore을 사용해서 DB의 내용을 가져오고, DB에 내용을 저장하는 기능을 구현해 보도록 하자.
2024.02.12 - [VB.NET/MS-SQL] - VB.NET 쿼리 없이 DB 사용하기 (EntityFrameworkCore) #1/3
2024.02.14 - [VB.NET/MS-SQL] - VB.NET 쿼리 없이 DB 사용하기 (EntityFrameworkCore) #2/3
6. DB를 사용하기 위한 클래스 생성
- ClassDB 라는 클래스를 생성해서 DB를 사용한다.
- SelectUserInfo : 쿼리문의 Select 기능을 대체하는 함수
- InsertUserInfo : 쿼리문의 Insert 기능을 대체하는 함수
Friend Class DBClass
Friend Shared Function SelectUserInfo(pDBInfo As DB_INFO, pUserID As String) As USER_INFO
Dim lpItem As New USER_INFO With {.User_id = ""}
Using dbItem As New DBConn(pDBInfo)
' User_Info 테이블에서 데이터 조회
'Dim users = dbItem.User_test.OrderByDescending(Function(u) u.User_score).ToList() ' 정렬
Dim users = dbItehttp://m.User_info.Where(Function(u) u.User_id = pUserID).ToList() ' 조건
If users.Count > 0 Then lpItem = users(0)
End Using
Return lpItem
End Function
Friend Shared Function InsertUserInfo(pDBInfo As DB_INFO, pUserInfo As USER_INFO) As Integer
Dim lpCnt As Integer = 0
Using dbItem As New DBConn(pDBInfo)
dbItem.Add(pUserInfo)
lpCnt = dbItem.SaveChanges()
End Using
Return lpCnt
End Function
End Class
자... 이제 이번 강좌의 가장 핵심이 나왔다. 첫번째 강좌에서도 잠깐 언급했지만, DB를 사용하는 가장 중요한 목적은 빠르게 데이터를 읽고 쓰는데 있다. 기존에는 DB의 데이터를 읽을때 Select 구문을 사용했고, DB에 데이터를 쓸때는 Insert 구문을 사용했다.
하지만, EntityFrameworkCore을 사용하게 되면 Select 구문도 안쓰고, Insert 구문도 안쓴다. 그러니 이들 구문을 대체할 다른 방법이 필요한 것이고, 위 소스에 이 방법이 들어있으니 하나씩 차근차근 살펴보자.
(1) SelectUserInfo 함수
예전 ADO 방식으로 DB를 사용할때는 명시적으로 Open문과 Close문을 사용해서 열고 닫아줘야 했는데, EntityFrameworkCore를 사용한 방식에서는 Using문을 사용해서 열고, 끝나면 자동으로 닫히게 된다. 여기서 User_info는 일종의 컴포넌트 역할을 수행하게 되는데 ADO의 RecordSet을 대체한다고 생각하면 될 듯 하다.
Dim users = dbItem.User_test.OrderByDescending(Function(u) u.User_score).ToList()
- 정렬 (Order By) : Select문의 가장 기본기능인 정렬을 구현했다. DBConn 클래스에 정의한 User_info 변수를 이용해서 데이터를 정렬하게 된다.
- OrderBy, OrderByDescending : 각각 Order By ASC, Order By Desc를 대체한다.
- Function(u) u.User_score : 람다 형식으로 함수를 선언해서 user_score를 기준으로 정렬하게 된다. 이 구문은 쿼리문으로 Order By user_score Desc를 대체한다.
Dim users = dbItehttp://m.User_info.Where(Function(u) u.User_id = pUserID).ToList()
- 조건 (Where) : Select문에서 조건문을 표헌한다.
- Function(u) u.User_id = pUserID : 역시 람다 형식의 함수를 이용해서 user_id를 기준으로 검색하게 된다. 이 구문은 쿼리문으로 Where user_id = 'pUserID'를 대체한다.
이처럼 쿼리문의 Where절과 Order By절을 숨겨놓고 함수로 사용하니 실제 코딩할때 쿼리문을 작성할 필요가 없는 것이다. 물론 Join문과 같은 복합적인 기능도 제공하지만, 이번 강좌에서는 이정도 수준의 설명만 진행하도록 하겠다.
(2) InsertUserInfo 함수
여기서도 Using문을 사용해서 DB에 접근한다. DB에 내용을 추가하고 SaveChanges 함수로 최종 저장하면 데이터가 Commit 되는 구조이다.
7. 메인 폼에서 DB의 내용을 읽고 쓰기
- 메인 폼에 아래 그림처럼 컨트롤을 추가하자.
컨트롤 | 이름 | 텍스트 |
From | FormMain | EntityFrameworkCore 예제 |
Button | ButtonSelect | &Select |
Button | ButtonInsert | &Insert |
Label | Label1 | ID : |
Label | Label2 | Name : |
Label | Label3 | Score : |
TextBox | TextBoxID | |
TextBox | TextBoxName | |
TextBox | TextBoxScore | |
ListBox | ListBoxLog |
(1) DB 정보 선언
Private DBInfo As New DB_INFO With {.Server = "CABBIKHAN\SQLEXPRESS", .DBName = "ECCoreExam", .UserID = "eccoreexam", .Password = "eccoreexam11", .Trust = True}
접속하는 DB의 정보를 넣는다. 필자는 MSSQL Express를 사용해서 로컬에 ECCoreExam이라는 DB를 만들고 사용자 아이디와 비밀번호를 설정했다. 이 부분은 각자 환경에 맞춰서 설정해주면 되겠다. 마지막 Trust는 SSL 인증서가 있으면 False를 넣어주면 된다. 내 로컬 PC에는 SSL 인증서가 없어서 True로 설정했다.
(2) Select 버튼 클릭
Private Sub ButtonSelect_Click(sender As Object, e As EventArgs) Handles ButtonSelect.Click
Call WriteUserList(DBClass.SelectUserList(DBInfo))
End Sub
Private Sub WriteUserList(pList As List(Of USER_INFO))
Dim lpMsg As String
If pList.Count = 0 Then
Call WriteLog("DB에 저장된 내용이 없습니다.")
Else
For i As Integer = 0 To pList.Count - 1
lpMsg = $"user_id={pList(i).User_id}, user_name={pList(i).User_name}, user_score={pList(i).User_score}"
Call WriteLog(lpMsg)
Next
End If
End Sub
Private Sub WriteLog(pStr As String)
Dim lpStr As String
lpStr = "[" & Format(Now, "yyyy/MM/dd HH:mm:ss") & "] " & pStr
ListBoxLog.Items.Insert(0, lpStr)
Do While ListBoxLog.Items.Count > 100
ListBoxLog.Items.RemoveAt(ListBoxLog.Items.Count - 1)
Loop
End Sub
위에서 만들어둔 SelectUserList 함수를 호출해서 가져온 사용자 목록을 리스트박스(ListBoxLog)에 뿌려준다. 처음 실행시 데이터가 없으니 없다고 뿌려주면 된다.
WriteLog 함수는 파라미터로 넘겨받은 문자열에 현재 날짜/시간을 추가해서 최대 100줄 한도 내에서 데이터를 화면에 뿌려주며, 100줄이 넘어가면 오래된 항목부터 삭제하는 간단한 함수이다.
(3) Insert 버튼 클릭
Private Sub ButtonInsert_Click(sender As Object, e As EventArgs) Handles ButtonInsert.Click
Dim lpItem As New USER_INFO With {.User_id = TextBoxID.Text, .User_name = TextBoxName.Text, .User_score = Val(TextBoxScore.Text)}
Dim lpCnt As Integer = DBClass.InsertUserInfo(DBInfo, lpItem)
Call WriteLog($"총 {lpCnt}개의 데이터가 삽입되었습니다.")
If lpCnt > 0 Then
Call WriteUserList(DBClass.SelectUserList(DBInfo))
End If
End Sub
위에서 만들어둔 InsertUserInfo 함수를 이용해서 화면에 입력한 사용자 아이디, 이름, 점수를 DB에 기록한 후, 전체 DB의 내용을 화면에 뿌려준다.
아래는 최초 실행시 Select 버튼을 한번 누르고, 텍스트박스에 적절한 값을 입력후 Insert버튼을 누른 후의 화면이다.
마치며...
이렇게 총 3개의 강좌를 통해 EntityFrameworkCore을 사용해서 MS-SQL을 다루는 방법에 대해 알아보았다. 데이터 삭제, 각종 Join문 등 여기서 다루지 않은 많은 기능들이 있지만, 이번 강좌의 목적은 생소한 개념인 EntityFrameworkCore을 이용해서 DB를 사용하는 방법을 알아보는 것이기 때문에 어느정도 목적에 부합은 했다고 생각된다.
이를 이용해서 조금더 심화된 기능을 구현하는건 직접 해보시기 바라며 이번 강좌를 마치도록 하겠다.
ps. 첨부된 파일은 VS2022에서 열어야 정상 동작하며, 웬만하면 정상 동작하겠지만 혹시 오류가 발생하면 NuGet 패키지 관리자에서 EntityFrameworkCore 관련 항목 제거 후 다시 설치해보자.
'VB.NET > MS-SQL' 카테고리의 다른 글
VB.NET 쿼리 없이 DB 사용하기 (EntityFrameworkCore) #2/3 (1) | 2024.02.14 |
---|---|
VB.NET 쿼리 없이 DB 사용하기 (EntityFrameworkCore) #1/3 (1) | 2024.02.12 |
MS-SQL Server 2022 설치 및 설정 (방화벽 외부 접속 포함) (0) | 2023.08.14 |
VB.NET에서 데이터베이스 백업 처리하기 (0) | 2023.04.17 |
[VB.NET] 차근차근 MS-Access DB 연결후 사용법 (1) | 2023.02.21 |