[C#] 데이터 베이스 연결 및 기본 CRUD

728x90

1. 데이터베이스 연결

1) MSSQL 연결

MSSQL을 설치하고 세팅하는 방법은 아래 글을 참고 하시면 됩니다.

 

MSSQL 설치 (tistory.com)

 

MSSQL 설치

1. 운영체제 비트수 확인 확인방법은1. 제어판 → 시스템 클릭2. 내PC(내컴퓨터) 오른쪽 클릭 → 속성 버튼을 클릭 두가지 방법중 하나를 선택하시면 됩니다.   위 화면 중 빨간 네모박스에 있

zero-week.tistory.com

 

 

먼저 SQL Management Studio 를 실행합니다.

 

데이터베이스 우클릭 새 데이터베이스 생성을 클릭합니다.

 

데이터베이스 이름을 작성하고 확인을 누르면 데이터베이스가 생성됩니다.

 

 

 

Visual Studio를 실행합니다.

 

MSSQL을 연결할때는 SqlConnection 클래스를 사용합니다. (mysql을 사용할때는 MySqlConnection을 사용한다고합니다. )

 

SqlConnection 에 대한 내용은 아래 문서를 참고하시면 됩니다.

 

SqlConnection 클래스 (System.Data.SqlClient) | Microsoft Learn

 

SqlConnection 클래스 (System.Data.SqlClient)

SQL Server 데이터베이스에 대한 연결을 나타냅니다. 이 클래스는 상속될 수 없습니다.

learn.microsoft.com

 

 

app.config에 아래 정보를 추가합니다.

 

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
    </startup>
	<appSettings>
		<add key="IP" value="127.0.0.1"/>
		<add key="PORT" value="9111"/>
		<add key="DBNAME" value="CSHARP"/>
		<add key="UID" value="sa"/>
		<add key="PWD" value="비밀번호"/>
	</appSettings>
</configuration>

 

데이터베이스 정보를 form 클래스에 직접 입력해도되지만 그렇게 하면 하나의 정보가 바뀔때 데이터를 사용하는 모든 클래스의 정보를 바꿔야 되므로 유지보수성이 떨어집니다.

그래서 app.config에 정보를 저장해놓고 데이터베이스의 정보가 변경된다면 app.config만 수정하는 것이 좋습니다.

 

app.config에 정보를 입력하셨다면 솔루션탐색기에서 참조 우클릭 참조추가 버튼을 클릭합니다.

 

어셈블리쪽에서 System.Configuration을 찾아 체크하고 확인버튼을 클릭합니다.

 

 

 

Form1.cs에 아래코드를 입력합니다.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        private SqlConnection conn = null;
        private string connStr = "SERVER=" + ConfigurationManager.AppSettings["IP"] + "," + ConfigurationManager.AppSettings["PORT"] + ";DATABASE="
            + ConfigurationManager.AppSettings["DBNAME"] + ";UID=" + ConfigurationManager.AppSettings["UID"] + ";PASSWORD=" + ConfigurationManager.AppSettings["PWD"] + ";";



        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        /// <summary>
        /// 데이터베이스 연결
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                conn = new SqlConnection(connStr);

                conn.Open();
                MessageBox.Show("데이터베이스 연결 성공");
            }
            catch(Exception ex)
            {
                MessageBox.Show(ex.Message); 
            }
        }

        /// <summary>
        /// 데이터베이스 연결 해제
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button2_Click(object sender, EventArgs e)
        {
            try
            {
                //null이 아니라면 버튼1 클릭이 실행된 것을 의미 -> 데이터베이스 연결됨
                if (conn != null)
                {
                    //데이터 베이스 연결 끊기
                    conn.Close();
                    MessageBox.Show("데이터 베이스 연결 해제");
                }
            }catch(Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
    }
}

 

 

실행결과

 

 

2) MYSQL 연결

mysql 설치방법은 아래 글을 참고하시면 됩니다.

 

mysql 설치 (tistory.com)

 

mysql 설치

[ 2023. 5. 21 기준]https://www.mysql.com/​DOWNLOADS 메뉴 클릭 ->MySQL Community (GPL) Downloads 클릭 ->MySQL Installer for Windows 클릭 ->​최신버전 확인 후Go to Download Page > 클릭Windows (x86, 32-bit), MSI Installer (용량 큰거

zero-week.tistory.com

 

1] Mysql.Data.dll 파일 import 

 

도구 → NuGet 패키지 관리자 → 솔루션용 NuGet 패키지 관리에 들어갑니다.

 

 

 

찾아보기 탭 클릭 → 검색란에 mysql 검색 → 첫번째를 클릭합니다.

 

우측화면에서 프로젝트 선택박스를 체크하고 설치버튼을 클릭합니다.

 

아래와 같은 메시지가 나타난다면 적용을 클릭합니다.

 

설치가 되었다면 아래 그림처럼 MySql.Data가 참조에 추가된 것을 확인할 수 있습니다.

 

2] MySql 연결 테스트

app.config에 아래코드를 추가합니다.

<appSettings>
	<add key="IP" value="localhost"/>
	<add key="PORT" value="3306"/>
	<add key="DBNAME" value="데이터베이스명"/>
	<add key="UID" value="root"/>
	<add key="PWD" value="비밀번호"/>
</appSettings>

 

 

Form1.cs

using MySql.Data.MySqlClient;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Configuration;
using System.Data;
using System.Drawing;
using System.Drawing.Text;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        private MySqlConnection conn = null;

        private string connStr = 
            "Server=" + ConfigurationManager.AppSettings["IP"] + ";" +
            "Port=" + ConfigurationManager.AppSettings["PORT"] + ";" +
            "Database=" + ConfigurationManager.AppSettings["DBNAME"] + ";" +
            "Uid=" + ConfigurationManager.AppSettings["UID"] + ";" +
            "Pwd=" + ConfigurationManager.AppSettings["PWD"] + ";";

        public Form1()
        {
            InitializeComponent();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            try
            {
                conn = new MySqlConnection(connStr);

                conn.Open();
                MessageBox.Show("mysql 연결 성공");
            }
            catch(Exception ex)
            {
                MessageBox.Show("mysql 연결 실패");
            }
        }

        private void button3_Click(object sender, EventArgs e)
        {
            try
            {                
                if (conn != null)
                {
                    //데이터 베이스 연결 끊기
                    conn.Close();
                    MessageBox.Show("데이터 베이스 연결 해제");
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
    }
}

 

실행결과

 

 

2. 기본 CRUD

MSSQL과 Mysql&MariaDB의 차이는 SqlConnection 과 SqlCommand 앞의 My가 붙냐 안붙냐의 차이와 데이터베이스 특성에 따른 쿼리문의 차이밖에 없습니다.

 

MSSQL은 윈폼에서의 예시이고 MySql은 WPF에서의 예시입니다.

1) 데이터베이스 테스트

SQL Server Management Studio에서 데이터베이스를 생성합니다.

생성방법은 아래글을 참고하시면 됩니다.

MSSQL 설치 (tistory.com)

 

MSSQL 설치

1. 운영체제 비트수 확인 확인방법은1. 제어판 → 시스템 클릭2. 내PC(내컴퓨터) 오른쪽 클릭 → 속성 버튼을 클릭 두가지 방법중 하나를 선택하시면 됩니다.   위 화면 중 빨간 네모박스에 있

zero-week.tistory.com

 

 

생성된 데이터베이스에서 우클릭 → 새 쿼리를 클릭합니다

 

 

테이블을 생성하는 쿼리문을 작성하고 실행버튼을 클릭합니다.

 

테이블이 생성된 것을 확인할 수 있습니다.

 

임의로 데이터를 삽입해보겠습니다.

 

INSERT INTO BOOKS(BOOKNO,NAME,CODE) VALUES(1,'아기돼지3형제','111111');
INSERT INTO BOOKS(BOOKNO,NAME,CODE) VALUES(2,'톰과제리','111112');
INSERT INTO BOOKS(BOOKNO,NAME,CODE) VALUES(3,'인어공주','111113');
INSERT INTO BOOKS(BOOKNO,NAME,CODE) VALUES(4,'미녀와야수','111114');

 

쿼리문에 위 sql문을 복사해서 붙여놓고 실행버튼을 클릭하면 됩니다.

 

 

저장된 내용을 확인하려면 테이블 우클릭 상위 1000개 행 선택을 클릭하시면 쿼리문이 자동으로 작성되면서

 

결과가 나타납니다.

 

2) 데이터베이스 삽입, 수정, 삭제, 조회 예제

 

이런식으로 데이터베이스를 사용하는 프로그램을 만들어보겠습니다.

 

먼저 전체 조회를 클릭했을 때의 옵션을 만들어보겠습니다.

 

클릭시 실행되는 메서드에 아래코드를 추가합니다.

1] 조회

DataSet ds = new DataSet();
 //using문을 사용하면 데이터를 끊는 close함수를 사용하지 않아도 된다.-> using함수가 종료되면서 close 효과가 나타난다.
 using (SqlConnection conn = new SqlConnection(connStr)) 
 {
     
     //conn.Open();

     string sql = "select * from BOOKS(NOLOCK)";
     //일반적으로 데이터베이스를 조회할때 한사람이 실행중이면 다른 사람은 접근을 제한(LOCK)해야한다. 예컨대 동시에 같은 데이터를 수정했을때 문제가 발생할 수 있기때문이다.
     // 그러나 조회같은 경우는 여러사람의 접근을 허용해도 된다. 즉 NOLOCK의 의미는 동시에 접근 가능하게 하는 것이다. 그러나 쿼리문에 NOLOCK을 작성하는 것은 MSSQL에서만 가능하다.
     //SqlDataAdapter 클래스를 사용하는 방법 -> SqlDataAdapter 클래스는 비연결형 함수로서 open함수를 사용하지 않아도 필요할 경우 자동으로 연결한 후 연결을 끊는다
     SqlDataAdapter adapter = new SqlDataAdapter(sql,conn); 

     //테이블 명은 작성을 해도 되고 안해도 된다.
     //adapter.Fill(ds,"BOOKS"); //테이블 명시
     adapter.Fill(ds); //테이블 명시X

     //SqlDataReader 클래스를 사용하는 방법-> SqlDataReader클래스는 연결형 함수로서 open함수를 반드시 사용해야 한다.
     //conn.Open();
     //DataTable dt = new DataTable();
     //SqlCommand command = new SqlCommand();
     //command.CommandText = sql;
     //command.Connection = conn;
     //SqlDataReader reader = command.ExecuteReader();
     //dt.Load(reader);
         
     //dataGridView1.DataSource = dt; //SqlDataReader 사용시

 }
 
 dataGridView1.DataSource = ds.Tables[0]; //SqlDataAdapter 사용시

 

2] 삭제

삭제 버튼 클릭시 실행되는 함수입니다.

 string bookNo = textBox1.Text;
 

 using (SqlConnection conn =  new SqlConnection(connStr))
 {
     conn.Open();

     SqlCommand command = new SqlCommand();
     command.Connection = conn;
     command.CommandText = "delete from BOOKS where BOOKNO=" + bookNo;
     command.ExecuteNonQuery();

     button6_Click(null, null);
 }

 

button6_click 함수를 호출하는 이유는 삭제된 후에 새로고침(전체조회)를 하기 위함입니다.

 

3] 수정

 string bookNo = textBox4.Text;
 string bookName = textBox3.Text;

 using (SqlConnection conn = new SqlConnection(connStr))
 {
     conn.Open();

     SqlCommand command = new SqlCommand();
     command.Connection = conn;
     command.CommandText = "update BOOKS set NAME='"+bookName+"' where BOOKNO=" + bookNo;
     command.ExecuteNonQuery();

     button6_Click(null, null);
 }

문자열은 작은따옴표 '' 를 넣어줘야 sql문에서 varchar등의 문자열로 인식합니다.

4] 삽입

string bookNo = textBox6.Text;
string bookName = textBox5.Text;
string bookCode = textBox7.Text;

using (SqlConnection conn = new SqlConnection(connStr))
{
    conn.Open();

    SqlCommand command = new SqlCommand();
    command.Connection = conn;
    command.CommandText = "insert into BOOKS(BOOKNO,NAME,CODE) values ("+bookNo+",'"+bookName+"','"+bookCode+"')";
    command.ExecuteNonQuery();

    button6_Click(null, null);
}

 

 

3) 참고 Mysql버전(WPF에서 사용)

MainWindow.xaml

<Window x:Class="WpfMariaDBConnection.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfMariaDBConnection"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>
        <DataGrid x:Name="grd" Grid.Column="0"></DataGrid>
        <Grid Grid.Column="1">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="*"/>
                <ColumnDefinition Width="*"/>
            </Grid.ColumnDefinitions>
            <Grid.RowDefinitions>
                <RowDefinition Height="*"/>
                <RowDefinition Height="*"/>
                <RowDefinition Height="*"/>
                <RowDefinition Height="*"/>
                <RowDefinition Height="*"/>
                <RowDefinition Height="*"/>
            </Grid.RowDefinitions>
            <Label Grid.Row="0" Grid.Column="0"
                   VerticalAlignment="Center"
                   HorizontalContentAlignment="Center"
                   Content="아이디"/>
            <TextBox x:Name="txtid"
                     Text="{Binding ElementName=grd,Path=SelectedItem.id}"
                     Grid.Row="0"
                     Grid.Column="1"
                     IsReadOnly="True"
                     FontSize="20"
                     VerticalAlignment="Center"></TextBox>
            <Label Grid.Row="1" Grid.Column="0"
       VerticalAlignment="Center"
       HorizontalContentAlignment="Center"
       Content="이름"/>
            <TextBox x:Name="txtName"
         Text="{Binding ElementName=grd,Path=SelectedItem.name}"
         Grid.Row="1"
         Grid.Column="1"
         
         FontSize="20"
         VerticalAlignment="Center"></TextBox>
            <Label Grid.Row="2" Grid.Column="0"
       VerticalAlignment="Center"
       HorizontalContentAlignment="Center"
       Content="나이"/>
            <TextBox x:Name="txtAge"
         Text="{Binding ElementName=grd,Path=SelectedItem.age}"
         Grid.Row="2"
         Grid.Column="1"
         
         FontSize="20"
         VerticalAlignment="Center"></TextBox>
            <Label Grid.Row="3" Grid.Column="0"
VerticalAlignment="Center"
HorizontalContentAlignment="Center"
Content="주소"/>
            <TextBox x:Name="txtAddress"
  Text="{Binding ElementName=grd,Path=SelectedItem.address}"
  Grid.Row="3"
  Grid.Column="1"
  
  FontSize="20"
  VerticalAlignment="Center"></TextBox>
            <Button Name="btnInsert" FontSize="20"
                    Grid.Row="4" Grid.Column="0" Click="btnInsert_Click">삽입</Button>
            <Button Name="btnUpdate" FontSize="20"
        Grid.Row="4" Grid.Column="1" Click="btnUpdate_Click">수정</Button>
            <Button Name="btnDelete" FontSize="20"
Grid.Row="5" Grid.Column="0" Click="btnDelete_Click">삭제</Button>
            <Button Name="btnClean" FontSize="20"
Grid.Row="5" Grid.Column="1" Click="btnClean_Click">클리어</Button>
        </Grid>
    </Grid>
</Window>

 

MainWindow.cs

using MySqlConnector;
using System.Data;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace WpfMariaDBConnection
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        MySqlConnection conn = new MySqlConnection("Server=localhost;Uid=root;Database=study;port=3308;pwd=1111");
        public MainWindow()
        {
            InitializeComponent();

            LoadData();
        }

        private void LoadData()
        {
            DataTable dt = new DataTable();
            MySqlCommand cmd = new MySqlCommand("select * from person",conn);
            conn.Open();

            //ExecuteReader는 반환값이 있을때 사용
            MySqlDataReader sdr = cmd.ExecuteReader();

            dt.Load(sdr);
            conn.Close();

            grd.ItemsSource = dt.DefaultView;
        }

        private void btnClean_Click(object sender, RoutedEventArgs e)
        {
            txtid.Clear();
            txtName.Clear();
            txtAge.Clear();
            txtAddress.Clear();
        }

        private void btnInsert_Click(object sender, RoutedEventArgs e)
        {
            if(txtName.Text.Length == 0)
            {
                MessageBox.Show("이름을 입력해주세요");
                return;
            }

            if (txtAge.Text.Length == 0)
            {
                MessageBox.Show("나이를 입력해주세요");
                return;
            }

            if (txtAddress.Text.Length == 0)
            {
                MessageBox.Show("주소를 입력해주세요");
                return;
            }
            try { 
            MySqlCommand cmd = new MySqlCommand("insert into person (name,age,address) values (@Name,@Age,@Address)",conn);

            cmd.CommandType = CommandType.Text;
            cmd.Parameters.AddWithValue("@Name", txtName.Text);
            cmd.Parameters.AddWithValue("@Age", txtAge.Text);
            cmd.Parameters.AddWithValue("@Address", txtAddress.Text);

            conn.Open();
            //ExecuteNonQuery는 반환값이 없을 때 사용
            cmd.ExecuteNonQuery();

            MessageBox.Show("입력되었습니다.");
            }catch(MySqlException ex)
            {
                MessageBox.Show(ex.Message);
            }
            finally
            {
                conn.Close();
                LoadData();
            }
        }

        private void btnUpdate_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                MySqlCommand cmd = new MySqlCommand(string.Format("update person set name='{0}',age='{1}',address='{2}' where id='{3}'",
                    txtName.Text,txtAge.Text, txtAddress.Text,txtid.Text
                    ),conn);
                conn.Open();

                cmd.ExecuteNonQuery();

                MessageBox.Show("수정되었습니다.");
            }catch (MySqlException ex)
            {
                MessageBox.Show(ex.Message);
            }
            finally 
            {
                conn.Close();
                LoadData();
            }   
        }

        private void btnDelete_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                MySqlCommand cmd = new MySqlCommand(string.Format("delete from person where id='{0}'",
                    txtid.Text
                    ), conn);
                conn.Open();

                cmd.ExecuteNonQuery();

                MessageBox.Show("삭제하였습니다.");
            }
            catch (MySqlException ex)
            {
                MessageBox.Show(ex.Message);
            }
            finally
            {
                conn.Close();
                LoadData();
            }
        }
    }
}

 

실행화면

'C# Programming > C#' 카테고리의 다른 글

[C#] 비동기 프로그래밍  (0) 2024.05.15
[C#] 멀티스레드  (0) 2024.05.14
[C#] 객체지향 프로그래밍  (0) 2024.05.14
[C#] 배열과 foreach문(반복)  (0) 2024.05.14
[C#] 비트 연산자  (0) 2024.05.13