본문 바로가기
C#/윈폼

윈폼 CRUD

by hoshi03 2024. 9. 25.

mssql에 기존에 만들어둔 test 스키마에 books 테이블 추가하고 책 데이터 넣어주기

CREATE TABLE
    BOOKS (
        BOOKNO int PRIMARY KEY,
        NAME varchar(50),
        CODE varchar(50)
    );

 

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');

 

 

윈폼 ui 꾸며서 조회될 것 만들어주기

왼쪽에 datagridview 오른쪽은 CRUD시 선택한 책 관련 정보가 나오는 ui로 구성했다

 

• 조회기능

전에 연결해둔 db에 쿼리를 날리고 결과를 sqladapter로 가져와서 데이터그리디뷰의 소스로 넣어준다

 

sqladapter / sqlReader 두가지 방식으로 데이터를 읽어올 수 있는데

어댑터는 비연결, 유저 메모리 부담

리더는 연결된 상태, 서버가 접속을 유지하는 방식

대부분 어댑터를 사용한다고한다

 

• sqlAdapter를 사용한 조회쿼리

 

private void button4_Click(object sender, EventArgs e)
{
    DataSet ds = new DataSet();

    //using 구문 내부에서만 db와 연결되서 동작하고 using 구문을 벗어나면 close() 메서드로 연결을 끊은 것과 동일하게 동작한다
    using (SqlConnection sqlConnection = new SqlConnection(connectionString))
    {
        //단순 조회의 경우에는 락을 해제해서 사용했다
        string selectQuery = "SELECT * FROM BOOKS(NOLOCK)";
        //sqladpater를 사용해서 자동으로 연결 후, 쿼리 실행, 연결 끊기
        SqlDataAdapter adapter = new SqlDataAdapter(selectQuery, sqlConnection);
        adapter.Fill(ds, "BOOKS");
    }

    //데이터소스 채워주기
    dataGridView1.DataSource = ds.Tables[0];
}

 

 

 

• sqlReader를 사용한 조회쿼리

sqlReader를 사용할때는 sqlConnection을 명시적으로 열어주고

sqlcommand를 작성한 후에 sqlReader를 command.ExecuteReader로 설정한다

 

// 데이터 전체조회
        private void button4_Click(object sender, EventArgs e)
        {
            DataSet ds = new DataSet();

            //using 구문 내부에서만 db와 연결되서 동작하고 using 구문을 벗어나면 close() 메서드로 연결을 끊은 것과 동일하게 동작한다
            using (SqlConnection sqlConnection = new SqlConnection(connectionString))
            {
                //단순 조회의 경우에는 락을 해제해서 사용했다
                string selectQuery = "SELECT * FROM BOOKS(NOLOCK)";

                //sqlreader 사용 방식
                sqlConnection.Open();
                DataTable dt = new DataTable();
                SqlCommand command = new SqlCommand();
                command.CommandText = selectQuery;
                command.Connection = sqlConnection;

                SqlDataReader sqlDataReader = command.ExecuteReader();
                dt.Load(sqlDataReader);
                dataGridView1.DataSource = dt;
			}

            ////데이터소스 채워주기
            //dataGridView1.DataSource = ds.Tables[0];
        }

 

• 데이터그리드뷰에서 선택한 행 정보 가져오기

 

데이터그리드뷰 속성 - 이벤트 - cellclick으로 해당 셀을 클릭했을때 발생할 이벤트를 추가할 수 있다

		private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
		{
            //db에서 해당 행의 특의 도메인을 가져오는 쿼리
            string bookNo = dataGridView1.Rows[e.RowIndex].Cells["BOOKNO"].Value.ToString();
            string bookName = dataGridView1.Rows[e.RowIndex].Cells["NAME"].Value.ToString();
            textBox1.Text = bookNo;
            textBox4.Text = bookNo;
            textBox2.Text = bookName;
        }

 

이렇게 특정 행의 정보를 가져온 다음, 해당 정보를 바탕으로 수정,삭제,변경 쿼리를 작성해보자

 

• 삭제 쿼리

sqlcommand에 cell클릭으로 가져온 정보를 넣은 쿼리문을 넣고 executeNonquery 메서드로 쿼리문을 실행한다

폼에 쿼리 내역을 반영하기 위해서 실행 후 전체조회 메서드를 호출해준다

        //삭제
		private void button1_Click(object sender, EventArgs e)
		{
            using (SqlConnection sqlConnection = new SqlConnection(connectionString))
            {
                sqlConnection.Open();
                string bookNo = textBox1.Text;
                string selectQuery = "DELETE FROM BOOKS WHERE BOOKNO = " + bookNo;
                SqlCommand  sqlCommand = new SqlCommand();
                sqlCommand.Connection = sqlConnection;
                sqlCommand.CommandText = selectQuery;
                sqlCommand.ExecuteNonQuery();
                //실행 후 전체조회 이벤트 발생해서 테이블 갱신시켜주기
                button4_Click(null, null);
            }
        }

 

나머지도 비슷한 형식이다

       //업데이트
		private void button2_Click(object sender, EventArgs e)
		{
            using (SqlConnection sqlConnection = new SqlConnection(connectionString))
            {
                sqlConnection.Open();
                string bookNo = textBox4.Text;
                string selectQuery = "UPDATE BOOKS SET NAME = '" + textBox3.Text + "' WHERE BOOKNO = " + bookNo;
                SqlCommand sqlCommand = new SqlCommand();
                sqlCommand.Connection = sqlConnection;
                sqlCommand.CommandText = selectQuery;
                sqlCommand.ExecuteNonQuery();
                //실행 후 전체조회 이벤트 발생해서 테이블 갱신시켜주기
                button4_Click(null, null);

            }
        }

        //추가
		private void button3_Click(object sender, EventArgs e)
		{
			using (SqlConnection sqlConnection = new SqlConnection(connectionString))
			{
				sqlConnection.Open();
				string bookNo = textBox6.Text;
				string selectQuery = "INSERT INTO BOOKS VALUES(" +textBox6.Text +",'" + textBox5.Text +"','"
                    + textBox7.Text + "')";
				//MessageBox.Show(selectQuery);
				SqlCommand sqlCommand = new SqlCommand();
				sqlCommand.CommandText = selectQuery;
				sqlCommand.Connection = sqlConnection;
				sqlCommand.ExecuteNonQuery();
				//실행 후 전체조회 이벤트 발생해서 테이블 갱신시켜주기
				button4_Click(null, null);

			}
		}
	}

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

프로그램 배포  (0) 2024.10.06
저장프로시저  (2) 2024.10.06
mssql 윈폼 연동  (2) 2024.09.25
사용자 정의 컨트롤러  (0) 2024.09.21
단일 프로세스  (0) 2024.09.21