



using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace wf13_bookrentalshop
{
public partial class FrmMain : Form
{
#region <생성자>
public FrmMain()
{
InitializeComponent();
}
#endregion
#region <이벤트 핸들러 영역>
private void FrmMain_Load(object sender, EventArgs e)
{
FrmLogin frm = new FrmLogin();
frm.ShowDialog();
}
private void ExitToolsStripMenuItem_Click(object sender, EventArgs e)
{
Application.Exit(); // 전체 프로그램 종료
}
#endregion
private void MniGenre_Click(object sender, EventArgs e)
{
FrmGenre frm = new FrmGenre();
frm.TopLevel = false;
this.Controls.Add(frm);
frm.Show();
}
private void FrmMain_FormClosing(object sender, FormClosingEventArgs e)
{
if (MessageBox.Show("종료하시겠습니까?", "확인", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
{
e.Cancel = false;
Environment.Exit(0);
}
else
{
e.Cancel = true;
}
}
}
}


using System;
using System.Windows.Forms;
using MySql.Data.MySqlClient;
namespace wf13_bookrentalshop
{
public partial class FrmLogin : Form
{
private bool IsLogined = false; // 로그인 성공했는지 여부
public FrmLogin()
{
InitializeComponent();
}
private void BtnLogin_Click(object sender, EventArgs e)
{
IsLogined = LoginProcess(); // 로그인을 성공해야만 true가 됨
if(IsLogined) this.Close();
}
private void BtnCancel_Click(object sender, EventArgs e)
{
// Application.Exit();
Environment.Exit(0); // 가장 완벽하게 프로그램을 종료
}
// 아이디에서 엔터치면 비밀번호로
private void TxtUserId_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == 13)
{
TxtPassword.Focus();
}
}
//비밀번호에서 엔터치면 로그인
private void TxtPassword_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == 13)
{
BtnLogin_Click(sender, e); // 버튼 클릭 이벤트 핸들러 호출
}
}
/// <summary>
/// DB userTbl에서 정보확인 로그인처리
/// </summary>
/// <returns></returns>
/// <exception cref="NotImplementedException"></exception>
private bool LoginProcess()
{
// Validation check
if(string.IsNullOrEmpty(TxtUserId.Text))
{
MessageBox.Show("유저아이디를 입력하세요","오류",MessageBoxButtons.OK, MessageBoxIcon.Error);
return false;
}
if(string.IsNullOrEmpty(TxtPassword.Text))
{
MessageBox.Show("비밀번호를 입력하세요", "오류", MessageBoxButtons.OK, MessageBoxIcon.Error);
return false;
}
string strUserId = "";
string strPassword = "";
try
{
string connectionString = "Server=localhost;Port=3306;Database=bookrentalshop;Uid=root;Pwd=815301";
// DB처리
using (MySqlConnection conn = new MySqlConnection(connectionString))
{
conn.Open();
#region <DB쿼리를 위한 구성>
string selQuery = @"SELECT userId
, password
FROM usertbl
WHERE userID = @userID
AND password = @password";
MySqlCommand selcmd = new MySqlCommand(selQuery, conn);
// @userID, @password 파라미터 할당
MySqlParameter prmUserID = new MySqlParameter("@userID", TxtUserId.Text);
MySqlParameter prmPassword = new MySqlParameter("@password", TxtPassword.Text);
selcmd.Parameters.Add(prmUserID);
selcmd.Parameters.Add(prmPassword);
#endregion
MySqlDataReader reader = selcmd.ExecuteReader(); //실행한 다음에 userId, password
reader.Read();
strUserId = reader["userId"] != null ? reader["userId"].ToString() : "-";
strPassword = reader["password"] != null ? reader["password"].ToString() : "-";
} // conn.Close();
//MessageBox.Show($"{strUserId} / {strPassword}");
}
catch(Exception ex)
{
MessageBox.Show($"비정상적인 오류 : {ex.Message}", "오류", MessageBoxButtons.OK, MessageBoxIcon.Error);
return false;
}
return true;
}
// 이게 없으면 X버튼이나 Alt+F4 로 종료했을때 메인폼이 나타남
private void FrmLogin_FormClosed(object sender, FormClosedEventArgs e)
{
if(IsLogined !=true) //로그인 안되었을때 창을 닫으면 프로그램 모두 종료
{
Environment.Exit(0 );
}
}
}
}


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace wf13_bookrentalshop
{
public partial class FrmGenre : Form
{
public FrmGenre()
{
InitializeComponent();
}
}
}







using MySql.Data.MySqlClient;
using System;
using System.Data;
using System.Diagnostics;
using System.Windows.Forms;
namespace wf13_bookrentalshop
{
public partial class FrmGenre : Form
{
bool isNew = false; // false(UPDATA) / true(INSERT)
#region <생성자>
public FrmGenre()
{
InitializeComponent();
}
#endregion
#region <이벤트 핸들러>
private void FrmGenre_Load(object sender, EventArgs e)
{
isNew = true; // 신규부터 시작
RefreshData();
}
private void BtnNew_Click(object sender, EventArgs e)
{
ClearInputs();
}
private void BtnSave_Click(object sender, EventArgs e)
{
if (CheckValidation() != true) return; // 입력검증
SaveData(); //데이터 저장 / 수정
RefreshData(); //데이터 재조회
ClearInputs(); //입력창 클리어
}
private void BtnDel_Click(object sender, EventArgs e)
{
if(isNew == true) //신규
{
MessageBox.Show("삭제할 데이터를 선택하세요", "오류",MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
//삭제여부를 물을 때 아니오를 누르면 삭제진행 취소
if (MessageBox.Show(this, "삭제하시겠습니까?", "삭제", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No) return;
// Yes를 누르면 계속 진행
DeleteData(); // 데이터 삭제 처리
RefreshData(); // 지우고나서 재조회
ClearInputs(); // 입력창 데이터 지우기
}
private void DgvResult_CellClick(object sender, DataGridViewCellEventArgs e)
{
// 그리드뷰 클릭시 발생하는 이벤트
if(e.RowIndex > -1) // 아무것도 선택 안하면 -1
{
var selData = DgvResult.Rows[e.RowIndex];
// Debug.WriteLine(selData.ToString());
// Debug.WriteLine(selData.Cells[0].Value);
// Debug.WriteLine(selData.Cells[1].Value);
TxtDivision.Text = selData.Cells[0].Value.ToString();
TxtNames.Text = selData.Cells[1].Value.ToString();
TxtDivision.ReadOnly = true; // PK 수정안되도록
isNew = false; //수정
}
}
#endregion
#region< 커스텀 메서드 >
private void RefreshData()
{
// DB divtbl 데이터 조회 DgvResult 뿌림
try
{
//string connectionString = "\"Server=localhost;Port=3306;Database=bookrentalshop;Uid=root;Pwd=815301";
using (MySqlConnection conn = new MySqlConnection(Helpers.Commons.ConnString))
{
if (conn.State == ConnectionState.Closed) conn.Open();
// 쿼리 작성
var selQuery = @"SELECT Division
, Names
FROM divtbl";
MySqlDataAdapter adapter = new MySqlDataAdapter(selQuery, conn);
DataSet ds = new DataSet();
adapter.Fill(ds, "divtbl"); // duvtbl으로 DataSet 접근 가능
//방법1
//DgvResult.DataSource = ds.Tables[0];
//방법2
DgvResult.DataSource = ds;
DgvResult.DataMember = "divtbl";
DgvResult.Columns[0].HeaderText = "장르코드";
DgvResult.Columns[1].HeaderText = "장르명";
}
}
catch (Exception ex)
{
MessageBox.Show($"비정상적인 오류 : {ex.Message}", "오류", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private bool CheckValidation()
{
var result = true;
var errorMsg = string.Empty;
// 입력검증
if (string.IsNullOrEmpty(TxtDivision.Text))
{
result = false;
errorMsg += "장르코드을 입력하세요.\n";
}
if (string.IsNullOrEmpty(TxtNames.Text))
{
result = false;
errorMsg += "장르명을 입력하세요.\n";
}
if(result == false)
{
MessageBox.Show(errorMsg,"오류",MessageBoxButtons.OK, MessageBoxIcon.Error);
return result;
}
else
{
return result;
}
}
private void ClearInputs()
{
TxtDivision.Text = TxtNames.Text = string.Empty;
TxtDivision.ReadOnly = false; // 신규일땐 입력 가능
TxtDivision.Focus();
isNew = true; // 신규
}
private void SaveData() // isNew가 True ==> INSERT / false ==> UPDATE
{
// INSERT부터 시작
try
{
using (MySqlConnection conn = new MySqlConnection(Helpers.Commons.ConnString))
{
if (conn.State == ConnectionState.Closed) conn.Open();
var query = "";
if (isNew)
{
query = @"INSERT INTO divtbl
VALUES ( @Division, @Names )";
}
else
{
query = @"UPDATE divtbl
SET Names = #Names
WHERE Division = @Division";
}
MySqlCommand cmd = new MySqlCommand(query, conn);
MySqlParameter prmDivision = new MySqlParameter("@Division", TxtDivision.Text);
MySqlParameter prmNames = new MySqlParameter("@Names", TxtNames.Text);
cmd.Parameters.Add(prmDivision);
cmd.Parameters.Add(prmNames);
var result = cmd.ExecuteNonQuery(); // INSERT, UPDATE, DELETE
if (result != 0)
{
// 저장성공
MessageBox.Show("저장성공!!", "저장", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
else
{
// 저장실패
MessageBox.Show("저장실패!!", "저장", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
catch (Exception ex)
{
MessageBox.Show($"비정상적인 오류 : {ex.Message}", "오류", MessageBoxButtons.OK, MessageBoxIcon.Error);
throw;
}
}
private void DeleteData()
{
try
{
using (MySqlConnection conn = new MySqlConnection(Helpers.Commons.ConnString))
{
if (conn.State == ConnectionState.Closed) conn.Open();
var query = @"DELETE FROM divtbl
WHERE Division = @Division";
MySqlCommand cmd = new MySqlCommand(query, conn);
MySqlParameter prmDivision = new MySqlParameter("@Division", TxtDivision.Text);
cmd.Parameters.Add(prmDivision);
var result = cmd.ExecuteNonQuery(); // INSERT, UPDATE, DELETE
if (result != 0)
{
// 저장성공
MessageBox.Show("삭제성공!!", "삭제", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
else
{
// 저장실패
MessageBox.Show("삭제실패!!", "삭제", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
catch (Exception ex)
{
MessageBox.Show($"비정상적인 오류 : {ex.Message}", "오류", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
#endregion
}
}

첫 실행화면 / 신규버튼


저장



삭제





using MySql.Data.MySqlClient;
using System;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using System.Windows.Forms;
using wf13_bookrentalshop.Helpers;
namespace wf13_bookrentalshop
{
public partial class FrmBooks : Form
{
bool isNew = false; // false(UPDATA) / true(INSERT)
#region <생성자>
public FrmBooks()
{
InitializeComponent();
}
#endregion
#region <이벤트 핸들러>
private void FrmGenre_Load(object sender, EventArgs e)
{
isNew = true; // 신규부터 시작
RefreshData();
LoadCboData(); //콤보박스에 들어갈 데이터 로드
DtpReleaseDate.CustomFormat = "yyyy-MM-dd";
DtpReleaseDate.Format = DateTimePickerFormat.Custom;
}
private void BtnNew_Click(object sender, EventArgs e)
{
ClearInputs();
}
private void BtnSave_Click(object sender, EventArgs e)
{
if (CheckValidation() != true) return; // 입력검증
SaveData(); //데이터 저장 / 수정
RefreshData(); //데이터 재조회
ClearInputs(); //입력창 클리어
}
private void BtnDel_Click(object sender, EventArgs e)
{
if(isNew == true) //신규
{
MessageBox.Show("삭제할 데이터를 선택하세요", "오류",MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
// FK 제약조건으로 지울 수 없는 데이터인지 먼저 확인
using (MySqlConnection conn = new MySqlConnection(Commons.ConnString))
{
if (conn.State == ConnectionState.Closed) conn.Open();
string strChkQuery = "SELECT COUNT(*) FROM rentaltbl WHERE bookIdx = @bookIdx";
MySqlCommand chkcmd = new MySqlCommand(strChkQuery, conn);
MySqlParameter prmBookIdx = new MySqlParameter("@bookIdx", TxtBookIdx.Text);
chkcmd.Parameters.Add(prmBookIdx);
var result = chkcmd.ExecuteScalar();
if (result.ToString() != "0")
{
MessageBox.Show("이미 대여중인 책입니다.","삭제",MessageBoxButtons.OK,MessageBoxIcon.Information);
return;
}
}
//삭제여부를 물을 때 아니오를 누르면 삭제진행 취소
if (MessageBox.Show(this, "삭제하시겠습니까?", "삭제", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No) return;
// Yes를 누르면 계속 진행
DeleteData(); // 데이터 삭제 처리
RefreshData(); // 지우고나서 재조회
ClearInputs(); // 입력창 데이터 지우기
}
private void DgvResult_CellClick(object sender, DataGridViewCellEventArgs e)
{
// 그리드뷰 클릭시 발생하는 이벤트
if(e.RowIndex > -1) // 아무것도 선택 안하면 -1
{
var selData = DgvResult.Rows[e.RowIndex];
// Debug.WriteLine(selData.ToString());
Debug.WriteLine(selData.Cells[0].Value);
Debug.WriteLine(selData.Cells[1].Value);
TxtBookIdx.Text = selData.Cells[0].Value.ToString();
TxtAuthor.Text = selData.Cells[1].Value.ToString();
CboDivision.SelectedValue = selData.Cells[2].Value; // B001 == B001
// selData.Cells[3] 사용 안 함
TxtNames.Text = selData.Cells[4].Value.ToString();
DtpReleaseDate.Value = (DateTime)selData.Cells[5].Value;
TxtISBN.Text = selData.Cells[6].Value.ToString();
NudPrice.Text = selData.Cells[7].Value.ToString();
isNew = false; //수정
}
}
private void DgvResult_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
{
DgvResult.ClearSelection(); // 최초에 첫번째 열 첫번째 셀 선택된 것 해제
}
#endregion
#region< 커스텀 메서드 >
private void RefreshData()
{
// DB divtbl 데이터 조회 DgvResult 뿌림
try
{
//string connectionString = "\"Server=localhost;Port=3306;Database=bookrentalshop;Uid=root;Pwd=815301";
using (MySqlConnection conn = new MySqlConnection(Helpers.Commons.ConnString))
{
if (conn.State == ConnectionState.Closed) conn.Open();
// 쿼리 작성
var selQuery = @"SELECT b.bookIdx,
b.Author,
b.Division,
d.Names AS DivNames,
b.Names,
b.ReleaseDate,
b.ISBN,
b.Price
FROM bookstbl AS b
INNER JOIN divtbl AS d
ON b.Division = d.Division
ORDER BY b.bookIdx ASC";
MySqlDataAdapter adapter = new MySqlDataAdapter(selQuery, conn);
DataSet ds = new DataSet();
adapter.Fill(ds, "bookstbl"); // bookstbl으로 DataSet 접근 가능
//방법1
DgvResult.DataSource = ds.Tables[0];
//방법2
/*DgvResult.DataSource = ds;
DgvResult.DataMember = "divtbl";*/
// 데이터 그리드뷰 컬럼 헤더 제목
DgvResult.Columns[0].HeaderText = "책번호";
DgvResult.Columns[1].HeaderText = "저자명";
DgvResult.Columns[2].HeaderText = "책코드";
DgvResult.Columns[3].HeaderText = "책장르";
DgvResult.Columns[4].HeaderText = "책제목";
DgvResult.Columns[5].HeaderText = "출판일자";
DgvResult.Columns[6].HeaderText = "ISBN";
DgvResult.Columns[7].HeaderText = "책가격";
// 컬럼 높이 또는 보이기
DgvResult.Columns[0].Width = 55;
DgvResult.Columns[2].Visible = false; // 코드 영역 보일 필요 없음
DgvResult.Columns[5].Width = 80;
DgvResult.Columns[7].Width = 80;
// 컬럼 정렬
DgvResult.Columns[0].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;
DgvResult.Columns[5].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
DgvResult.Columns[7].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;
}
}
catch (Exception ex)
{
MessageBox.Show($"RefreshData() 비정상적인 오류 : {ex.Message}", "오류", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private bool CheckValidation()
{
var result = true;
var errorMsg = string.Empty;
// 입력검증
if (string.IsNullOrEmpty(TxtAuthor.Text))
{
result = false;
errorMsg += "※ 저자명을 입력하세요.\n";
}
if (CboDivision.SelectedIndex < 0)
{
result = false;
errorMsg += "※ 장르를 선택하세요.\n";
}
if (string.IsNullOrEmpty(TxtNames.Text))
{
result = false;
errorMsg += "※ 책제목을 입력하세요.\n";
}
if (DtpReleaseDate.Value == null)
{
result = false;
errorMsg += "※ 출판일자를 선택하세요.\n";
}
if (result == false)
{
MessageBox.Show(errorMsg,"오류",MessageBoxButtons.OK, MessageBoxIcon.Error);
return result;
}
else
{
return result;
}
}
private void ClearInputs()
{
TxtBookIdx.Text = TxtAuthor.Text = string.Empty;
TxtNames.Text = TxtISBN.Text = string.Empty;
CboDivision.SelectedIndex = -1;
DtpReleaseDate.Value = DateTime.Now;
NudPrice.Value = 0;
TxtAuthor.Focus();
isNew = true; // 신규
}
private void SaveData() // isNew가 True ==> INSERT / false ==> UPDATE
{
// INSERT부터 시작
try
{
using (MySqlConnection conn = new MySqlConnection(Helpers.Commons.ConnString))
{
if (conn.State == ConnectionState.Closed) conn.Open();
var query = "";
if (isNew)
{
query = @"INSERT INTO bookstbl
(Author,
Division,
Names,
ReleaseDate,
ISBN,
Price)
VALUES
(@Author,
@Division,
@Names,
@ReleaseDate,
@ISBN,
@Price)";
}
else
{
query = @"UPDATE bookstbl
SET Author = @Author,
Division = @Division,
Names = @Names,
ReleaseDate = @ReleaseDate,
ISBN = @ISBN,
Price= @Price
WHERE bookIdx = @bookIdx";
}
MySqlCommand cmd = new MySqlCommand(query, conn);
MySqlParameter prmAuthor = new MySqlParameter("@Author", TxtAuthor.Text);
MySqlParameter prmDivision = new MySqlParameter("@Division", CboDivision.SelectedValue.ToString());
MySqlParameter prmNames = new MySqlParameter("@Names", TxtNames.Text);
MySqlParameter prmReleaseDate = new MySqlParameter("@ReleaseDate", DtpReleaseDate.Value);
MySqlParameter prmISBN = new MySqlParameter("@ISBN", TxtISBN.Text);
MySqlParameter prmPrice = new MySqlParameter("@Price", NudPrice.Value);
cmd.Parameters.Add(prmAuthor);
cmd.Parameters.Add(prmDivision);
cmd.Parameters.Add(prmNames);
cmd.Parameters.Add(prmReleaseDate);
cmd.Parameters.Add(prmISBN);
cmd.Parameters.Add(prmPrice);
if (isNew == false) // UPDATE 할 땐 bookIdx 파라미터를 추가
{
MySqlParameter prmBookIdx = new MySqlParameter("@bookIdx", TxtBookIdx.Text);
cmd.Parameters.Add(prmBookIdx);
}
var result = cmd.ExecuteNonQuery(); // INSERT, UPDATE, DELETE
if (result != 0)
{
// 저장성공
MessageBox.Show("저장성공!!", "저장", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
else
{
// 저장실패
MessageBox.Show("저장실패!!", "저장", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
catch (Exception ex)
{
MessageBox.Show($"SaveData() 비정상적인 오류 : {ex.Message}", "오류", MessageBoxButtons.OK, MessageBoxIcon.Error);
throw;
}
}
private void DeleteData()
{
try
{
using (MySqlConnection conn = new MySqlConnection(Helpers.Commons.ConnString))
{
if (conn.State == ConnectionState.Closed) conn.Open();
var query = @"DELETE FROM bookstbl
WHERE bookIdx = @bookIdx";
MySqlCommand cmd = new MySqlCommand(query, conn);
MySqlParameter prmBookIdx = new MySqlParameter("@bookIdx", TxtBookIdx.Text);
cmd.Parameters.Add(prmBookIdx);
var result = cmd.ExecuteNonQuery(); // INSERT, UPDATE, DELETE
if (result != 0)
{
// 저장성공
MessageBox.Show("삭제성공!!", "삭제", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
else
{
// 저장실패
MessageBox.Show("삭제실패!!", "삭제", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
catch (Exception ex)
{
MessageBox.Show($"DeleteData() 비정상적인 오류 : {ex.Message}", "오류", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void LoadCboData()
{
try
{
using (MySqlConnection conn = new MySqlConnection(Commons.ConnString))
{
if(conn.State == ConnectionState.Closed)
{
conn.Open();
}
var query = "SELECT Division, Names FROM divtbl";
MySqlCommand cmd = new MySqlCommand(query, conn);
MySqlDataReader reader = cmd.ExecuteReader();
var temp = new Dictionary<string, string>();
while (reader.Read())
{
temp.Add(reader[0].ToString(), reader[1].ToString()); // (key)B001, (value)공포/스릴러
}
// 콤보박스에 할당
CboDivision.DataSource = new BindingSource(temp, null); //divtbl은 null로 써도 무방
CboDivision.DisplayMember = "Value";
CboDivision.ValueMember = "Key";
CboDivision.SelectedIndex = -1;
}
}
catch (Exception ex)
{
MessageBox.Show($"LoadCboData() 비정상적인 오류 : {ex.Message}", "오류", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
#endregion
}
}


이전에 60번 데이터를 삭제했기 때문에 61번에 생김
