가장 기본적이고 전통적임
사용이 편리함
DB와 직접 연결하고 SQL 실행
성능 빠르고, 세밀한 제어 가능
저수준 함수(매핑이 되어 있음)이므로, DB에 대한 이해도가 높아질 수 있음.
하지만, 코드를 직접 작성해야 하고, 코드 장황해지고 유지보수가 힘들 수 있음.
- DB 와 연결하기 위한 표준 라이브러리 .
클래스 집합체. 사용자가 편리하게 API 모아 놓음- 주요 기능 : DB연결, SQL 명령어 실행 , 결과 조회 및 데이터 셋 관리
동작구조. ADO.NET의 생명주기
- 애플리케이션이 SqlConnection으로 DB에 연결
- SqlCommand로 SQL 명령 전달 후 실행
- DB가 결과 반환 -> SqlDataReader 또는 DataSet으로 가져옴
- 연결종료
SqlDataReader : Forward - only 읽기 전용 결과
SqlDataAdapter : DB <-> DataSet 간 데이터 전송
DataSet / DataTable : 메모리 내 데이터 저장소(비연결형)
프로그램의 .dll 파일은 메모리에 올라가는데, SqlConnection 사용할 때 namespace 정의를 해야 동작이 가능하다.


namespace ConsoleApp2
{
class Program
{
static void Main(string[] args)
{
string connectString = "Data Source=(localdb)\\MSSQLLocalDB;Integrated Security=True;Persist Security Info=False;Pooling=False;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=True;Application Name=\"SQL Server Management Studio\";Command Timeout=30";
using (SqlConnection connection = new SqlConnection(connectString))
{
connection.Open();
}
}
}
}
using 선언

Nuget 패키지에서

아래 패키지 다운로드 하면

아래 참조 파일인 .dll이 나타난다.


- ExectueNonQuery - 데이터 조작(Insert,UPDATE,DELETE)
- ExecuteScalar - 단일 값 반환
-첫번재 행의 첫번째 컬럼 값을 반환 . ex) COUNT,MAX,MIN 같은 집계 함수- ExecuteReader - 다중 행 조회
결과를 순방향(특정 지점을 읽을 수 없음), 읽기 전용으로 가져옴
속도가 가장 빠른 조회 방법
IF DB_ID('Test01') IS NULL
BEGIN
CREATE DATABASE Test01
END
GO
USE Test01;
GO
IF OBJECT_ID('dbo.UserAccount','U') IS NOT NULL DROP TABLE dho.UserAccount;
GO
CREATE TABLE dbo.UserCount
(
ID INT IDENTITY(1,1) PRIMARY KEY,
Email NVARCHAR(100) NOT NULL UNIQUE,
[Password] NVARCHAR(100) NOT NULL,
CreatedAt DATETIME2(0) NOT NULL DEFAULT SYSUTCDATETIME()
);
GO
INSERT INTO dbo.UserCount(Email,[Password]) VALUES
('wls6189@naver.com','wls6189'),
('vksej1235@gmail.com','wls1235');
GO
using System;
using System.Collections.Generic;
using Microsoft.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp2
{
class Program
{
private const string connectString = "Data Source=(localdb)\\MSSQLLocalDB;Integrated Security=True;Persist Security Info=False;Pooling=False;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=True;Application Name=\"SQL Server Management Studio\";Command Timeout=30";
static void Main(string[] args)
{
//1. 연결 테스트
ConnectionDBTest();
}
static void ConnectionDBTest()
{
using (SqlConnection connection = new SqlConnection(connectString))
{
connection.Open();
Console.WriteLine("DB 연결 완");
const string sql = @"INSERT INTO dbo.UserCount";
}
}
}
}

중요한 것은 SQL문을 어떻게 잘 작성하느냐가 중요하다. 조회 후 데이터 삽입하는 방식으로 SQL문을 작성한다.
또한 SqlConnection으로 DB에 연결(Open)해주고, SqlCommand를 통해서 SQL문을 이용하여 DB 실행
처음엔 삽입한 데이터가 중복됐는지 확인 후, 중복이 없으면 삽입하는 방식


ExcecuteScaler() 메서드는 쿼리 결과에서 첫번째 행의 첫번째 열의 값을 반환한다. 단일 값을 가져올 때 가장 적합하다. 번외로 ExecuteReader () 메서드는 여러 행/ 열 테이블을 조회하고, ExectueNonQueary()는 데이터 변경하여 쿼리를 실행한다.
SQL문을 아래 처럼 작성한 이유는 COUNT(*)는 테이블의 전체 행 개수를 반환하는 집계 함수이다. 여기서는 UserCount 테이블에 몇 명의 사용자가 등록되어 있는지 사용자 수를 세기 위해 이 쿼리를 사용하였다.


다중 조회를 할 때 ExecuteReader() 메서드가 적합하다고 했었다.
sql문을 보면 UserCount 테이블에서 모든 행(ID,Email,Password) 컬럼을 ID 기준으로 정렬해서 가져온다.
마찬가지로 SqlConnection을 열어서 DB에 연결 한다
SqlCommand 생성하여 ExcecuteReader()를 통해 쿼리를 실행 하고, 결과 집합을 reader에 저장한다.
while문을 통해 reader.Read() 하여 다음 행이 있다면 true, 없다면 false 처리 후 GetInt, GetString,GetDateTime을 통해 각 타입을 가져오고 출력



인자로 전달 받은 email,newPassword를 cmd의 파라미터로 값들을 추가한다.

추가한 것을 실제 실행하기 위해 ExcecuteNonQuery(); 를 호출


위 5번 과정과 동일한 방식이다.


var user = new User {Name = "kj" , Age = 25};
dB.Add(user);
dB.SaveChanges(); //INSERT INTO Users(Name,Age) VALUES ("AK",32);
var users = db.Users.Where(u => u.Age > 20).ToList();
- 스키마의 User테이블에서 Age가 20이상일 때 리스트로 변환하여 users에 저장
public DBSet<UserAccount> UserAccounts {get; set;}
var list = DB이름.테이블이름.WHERE().OrederBy().ToList();
var list1 = DB이름.테이블이름.WHERE().OrederByDescending().ToList();
현재 비쥬얼스튜디오 Net 버전

Nuget 패키지 관리에 들어가서 아래 패키지 다운로드







DBContext를 상속 받기 위해 아래 using문을 선언해야 함

UserAccount의 엔티티 클래스를 DB의 테이블로 지정
Character의 엔티티 클래스를 DB의 테이블로 지정

내가 짠 LINQ를 SQL서버에 전송하기 위해 매핑하는 작업을 한다. UseSqlServer 함수 안에 로컬 SQL Server 연결 문자열을 적는다.



