본문 바로가기
C++ 200제/코딩 IT 정보

C# MSSQL Open, Select, Insert 연동 (SqlConnection, SqlCommand)

by vicddory 2018. 8. 18.

C# MSSQL Open, Select, Insert 연동 (SqlConnection, SqlCommand)



좋은 예제가 있어서 요약도 할 겸, 포스팅 남겨 봅니다.


CRUD(Create, Read, Update, Delete) 중에서 Create, Read (Select, Insert) 예제에 해당합니다. C#에선 C# MSSQL을 사용하기에 편한 환경을 제공해 코딩할 양이 많진 않습니다.


1. 기본 클래스 CreateNewPlayer()

참조한 사이트에도 간단히 설명이 나와 있습니다.


16~19번 라인처럼 간단하게 Insert 할 데이터의 적합성 검사(Select를 통해)를 하고, 정상이라면 새로운 데이터를 Insert 합니다. 이 클래스 자체에는 C# MSSQL을 직접 다루는 코드는 없습니다.

저는 이 점이 마음에 들더군요. MSSQL 예제를 여러 개 봤는데 확실히 SQL 쿼리를 호출하는 부분과 직접 사용하는 부분은 분리하는 게 좋네요. 예제 자체는 기능이 적지만 확장하기에 좋은 소스입니다. 좋아요.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
using System;
 
namespace DataBase.Mapper
{
    public class Player
    {
        public double value { get; private set; }
 
        public Player(double _value)
        {
            value = _value;
        }
 
        public static Player CreateNewPlayer(double _value = -1.0)
        {
            if (_value != -1.0)
            {
                throw new ArgumentException("Value cannot be empty.");
            }
            
            PlayerDataMapper _playerDataMapper = new PlayerDataMapper();
            
            if (_playerDataMapper.PlayerNameExistsInDatabase(_value))
            {
                throw new ArgumentException("Value already exists.");
            }
            
            _playerDataMapper.InsertNewPlayerIntoDatabase(_value);
 
            return new Player(_value);
        }
    }
}
cs


23번 라인에서는 이미 존재하는 데이터인지 확인합니다.


만약 데이터가 존재한다면, 고의로 Exception을 발생시켜 더는 컬럼 추가가 이뤄지지 않습니다. 만약, 존재하지 않는 데이터라면 28번 라인처럼 데이터를 테이블에 추가해 줍니다.


2. 매퍼 클래스(C# MSSQL, SqlConnection.Open(), SqlCommand.ExecuteScalar())


C# MSSQL Open, Select, Insert 연동 (SqlConnection, SqlCommand)[SqlConnection, SqlCommand 예제]


MSSQL Management Studio를 이용해 위와 같이 테이블을 생성했습니다.


ID는 bigint로 Null 허용이 안 됩니다. ID 사양은 "예"로 설정했고 자동 증가 값은 1입니다. 그리고 Value는 decimal(18, 3)로 최대 18자리이면서 소수점은 3자리까지 표현하죠. 이렇게 존재하는 테이블에 컬럼을 추가하는 소스는 바로 아래에 있습니다.

아래 코드는 3개의 기능이 있습니다.


C# MSSQL 예제


private readonly string _connectionString = "Data Source=0.0.0.0;Initial Catalog=DBNAME;User ID=id;Password=pw";


1. SqlConnection connection = new SqlConnection(_connectionString)

- string 문자열 변수를 이용해 DB에 연결합니다.


2. playersWithThisName.CommandText =

       "SELECT COUNT([Value]) FROM [db].[table] WHERE Value = @Value";

- Select 문을 이용해 기존에 존재하는 데이터 개수를 조회합니다.


3. playersWithThisName.CommandText =

       $"INSERT INTO [db].[table] ([Value]) VALUES ({_value.ToString()})";

- Insert 문을 이용해 테이블에 컬럼을 추가합니다.


C# MSSQL Open, Select, Insert 연동 (SqlConnection, SqlCommand)[SqlConnection, SqlCommand 예제]


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
using System.Data;
using System.Data.SqlClient;
 
namespace DataBase.Mapper
{
    public class PlayerDataMapper
    {
        private readonly string _connectionString =
            "Data Source=0.0.0.0;Initial Catalog=DBNAME;User ID=id;Password=pw";
 
        public bool PlayerNameExistsInDatabase(double _value)
        {
            using (SqlConnection connection = new SqlConnection(_connectionString))
            {
                connection.Open();
 
                using (SqlCommand playersWithThisName = connection.CreateCommand())
                {
                    playersWithThisName.CommandType = CommandType.Text;
                    playersWithThisName.CommandText =
                        "SELECT COUNT([Value]) FROM [db].[table] WHERE Value = @Value";
                    playersWithThisName.Parameters.AddWithValue("@Value", _value);
                    
                    int existingRowCount = (int)playersWithThisName.ExecuteScalar();
                    
                    return existingRowCount > 0 ? true : false;
                }
            }
        }
 
        public void InsertNewPlayerIntoDatabase(double _value)
        {
            using (SqlConnection connection = new SqlConnection(_connectionString))
            {
                connection.Open();
 
                using (SqlCommand playersWithThisName = connection.CreateCommand())
                {
                    playersWithThisName.CommandType = CommandType.Text;
                    playersWithThisName.CommandText =
                        $"INSERT INTO [db].[table] ([Value]) VALUES ({_value.ToString()})";
                    playersWithThisName.Parameters.AddWithValue("@Value", _value);
                    playersWithThisName.ExecuteNonQuery();
                }
            }
        }
    }
}
cs

2번 라인처럼 System.Data.SqlClient를 using에 추가해 주어야 C# MSSQL 관련된 코드를 작성할 수 있습니다.


15번, 35번에 보이는 connection.Open()은 데이터베이스에 접속하는 코드입니다. 그전에 using 문에서 DB 접속 정보가 유효하지 않다는 것을 확인할 수는 없습니다. 대신 Open() 소스를 통해 접속 여부를 알아낼 수 있어요.


아주 단순하게 Open() 함수를 호출하고 기다리세요. 그러면 기본값인 약 5초 후에 된다 안 된다 결과가 나옵니다. 그러니, 이 부분을 try catch로 묶어서 사용하는 편이 좋겠죠.


13번, 33번 영역 안쪽에 또 다른 using 문이 있는데, SqlCommand를 활용하기 위해 존재합니다.


using을 사용하는 이유는 using 영역을 벗어나면 내부에서 사용되었던 메모리가 모두 해제됩니다. 그래서 프로그래머로선 메모리 관리하기 매우 편해요.


그러니 파일 입출력이나 C# MSSQL 같은 데이터베이스를 사용할 땐 되도록 using을 사용하는 버릇을 들여놓는 게 좋은 겁니다.


C# MSSQL Open, Select, Insert 연동 (SqlConnection, SqlCommand)[SqlConnection, SqlCommand 예제]


그렇게 내부 소스를 보면, CommandType, CommandText, Parameters.AddWithvale, ExecuteNonQuery까지 총 4개의 함수를 사용하는데 일반적으로 이 4개의 함수 호출은 일종의 세트와도 똑같으니 이 형태로 쿼리를 구성하는 게 좋습니다.


20~21번 라인은 Select 문으로 입력하려는 데이터가 존재한다면 true를 반환하고, 아니라면 false를 반환합니다. 여기서 false가 반환되어야 기본 클래스에서 31번 라인의 Insert 함수를 호출하게 됩니다.


40~41번 라인은 Insert문으로 기존에 없던 데이터라면 새롭게 추가합니다. 20~21번 라인과 공통이지만, 반드시 ExecuteNonQuery 함수를 호출해 명령어를 실행해야 합니다.


3. 실행하기


1
Player player = Player.CreateNewPlayer(8.34);
cs


위의 소스를 실행하는 코드는 간단합니다.


Player 객체를 생성하며 추가하고 싶은 데이터를 인자로 넘겨주면 됩니다. 근데, 여기까지 글을 작성하고 보니 43번 라인에 결과를 받아 리턴하는 코드가 없네요. 데이터 추가하지 못하면 못했다고 알려주는 코드가 필요합니다. ... 여러분은 까먹지 말고 꼭 코드 넣어 사용하세요 ...


여기까지 간단한 C# MSSQL 쿼리문 사용하기 방법이었습니다.


C# MSSQL Open, Select, Insert 연동 (SqlConnection, SqlCommand)

댓글