TABLE
// TABLE 생성 예시
CREATE TABLE TEST_SUBWAY(
SUBWAY_IDX NUMBER NOT NULL PRIMARY KEY,
SUBWAY_NAME VARCHAR2(81),
SUBWAY_LINE VARCHAR2(81),
SUBWAY_START_TIME VARCHAR2(81),
SUBWAY_END_TIME VARCHAR2(81)
);
SEQUENCE 생성 예시
CREATE SEQUENCE SUBWAY_IDX
// INSERT 예시
INSERT INTO TEST_SUBWAY VALUES(
SUBWAY_IDX.NEXTVAL,
'서울역',
'1호선',
'시청 방향 = 05 : 20 | 남영 방향 = 05 : 20',
'시청 방향 = 24 : 48 | 남영 방향 = 24 : 03'
);
// UPDATE 예시
UPDATE TEST_SUBWAY SET
SUBWAY_NAME = '용산',
SUBWAY_LINE = '경의중앙선',
SUBWAY_START_TIME = '효창공원앞 방향 = 05 : 21 | 이촌 방향 = 05 : 01',
SUBWAY_END_TIME = '효창공원앞 방향 = 23 : 49 | 이촌 방향 = 24 : 06'
WHERE SUBWAY_IDX =4;
// DELETE 예시
DELETE TEST_SUBWAY WHERE SUBWAY_IDX = 5
// SELECT 예시
SELECT * FROM TEST_SUBWAY
XML + XML CLASS
<?xml version="1.0" encoding="utf-8" ?>
<Oracle_Connection_Data>
<IP_Address>아이피 주소</IP_Address>
<Service_Name>서비스 이름</Service_Name>
<ID>아이디</ID>
<Password>패스워드</Password>
</Oracle_Connection_Data>
<!-- Oracle_Connection_Data라서 xml 파일 이름은 OCD_FILE라고 지었다. -->
위와 같이 XML 파일을 생성하였으면 XML 파일을 현재 프로그램의 실행 위치에 넣어준다 (xml file → bin\Debug)
(xml 파일을 bin\Debug에 넣어준 이유 : xml_url = Application.StartupPath + @"\OCD_FILE.xml";를 사용하기 위함)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Xml;
namespace TEST
{
class Xml_conn
{
private XmlDocument xd;
private XmlNodeList xnl;
private string xml_url;
private string ip;
private string sv;
private string id;
private string pw;
public void Xml_Conn_fn()
{
try
{
xd = new XmlDocument();
// xml 파일을 bin\Debug에 넣어준 이유
xml_url = Application.StartupPath + @"\OCD_FILE.xml";
xd.Load(xml_url);
xnl = xd.SelectNodes("Oracle_Connection_Data");
foreach (XmlNode xn in xnl)
{
ip = xn["IP_Address"].InnerText; //xml 파일에 적은 IP 주소 값
sv = xn["Service_Name"].InnerText; // xml 파일에 적은 SERVICE 이름 값
id = xn["ID"].InnerText; // xml 파일에 적은 ID 값
pw = xn["Password"].InnerText; // xml 파일에 적은 PASSWORD 값
}
}
catch
{
MessageBox.Show("xml error");
}
}
//오라클 연결때 필요하다고 생각되서 GET을 만들었다 더 좋은 방법이 있거나 아닐 수도 있다
public string get_ip
{
get { return ip; }
}
public string get_service
{
get { return sv; }
}
public string get_id
{
get { return id; }
}
public string get_password
{
get { return pw; }
}
}
}
이렇게 클래스를 따로 만든 이유는 클래스를 나눠서 작성하는 것이 좋다고 생각됐다.
(c# 배운지 아직 4주밖에 안되서 사실 이게 좋은건지 잘 모른다 근데 개인적으로는 이렇게 클래스로 나누는게 좋은 것 같다.)
ORACLE CLASS
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Oracle.DataAccess.Client;
using System.Windows.Forms;
namespace TEST
{
class Oracle_conn
{
private Xml_conn xc = new Xml_conn();
private OracleConnection conn;
private string ip;
private string sv;
private string id;
private string pw;
private string connstr;
public void Oracle_Conn_Fn()
{
try
{
xc.Xml_Conn_fn();
// xml class에서 만들었던 GET
ip = xc.get_ip;
sv = xc.get_service;
id = xc.get_id;
pw = xc.get_password;
// 오라클 연결
connstr = "data source=(DESCRIPTION =(ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)(HOST = " + ip + ")" +
"(PORT = 1521)))(CONNECT_DATA =(SERVICE_NAME = " + sv + ")));USER ID=" + id + ";PASSWORD=" + pw + ";";
conn = new OracleConnection(connstr);
conn.Open();
}
catch
{
MessageBox.Show("oracle error");
}
}
public OracleConnection get_conn
{
get { return conn; }
}
}
}
BASIC FORM
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;
using Oracle.DataAccess.Client;
namespace TEST
{
public partial class BASIC_FORM : Form
{
Oracle_conn oc = new Oracle_conn();
OracleDataAdapter oda;
OracleCommand cmd;
DataSet ds;
string sql_str;
int row_idx;
string selected_idx_value;
string selected_name_value;
string selected_line_value;
public BASIC_FORM()
{
InitializeComponent();
}
public void fnSearch()
{
oc.Oracle_Conn_Fn();
sql_str = "SELECT * FROM TEST_SUBWAY ORDER BY SUBWAY_IDX ASC";
cmd = new OracleCommand(sql_str, oc.get_conn);
cmd.ExecuteReader();
ds = new DataSet();
oda = new OracleDataAdapter(sql_str, oc.get_conn);
oda.Fill(ds);
fpSpread1.DataSource = ds.Tables[0];
fpSpread1_Sheet1.Columns[0, 2].Width = 150; // 스프레드시트 셀 크기 조절
fpSpread1_Sheet1.Columns[3, 4].Width = 327; // 스프레드시트 셀 크기 조절
for (int i = 0; i < fpSpread1.ActiveSheet.ColumnCount; i++)
{
// 수평 정렬
fpSpread1.ActiveSheet.Columns[i].HorizontalAlignment = FarPoint.Win.Spread.CellHorizontalAlignment.Center;
// 수직 정렬
fpSpread1.ActiveSheet.Columns[i].VerticalAlignment = FarPoint.Win.Spread.CellVerticalAlignment.Center;
}
oc.get_conn.Close();
}
private void Basic_Form_Load(object sender, EventArgs e)
{
try
{
// 스프레드시트 하나의 행 전체 선택
fpSpread1.Sheets[0].OperationMode = FarPoint.Win.Spread.OperationMode.SingleSelect;
for (int i = 0; i < fpSpread1.ActiveSheet.ColumnCount; i++)
{
// 수평 정렬
fpSpread1.ActiveSheet.Columns[i].HorizontalAlignment = FarPoint.Win.Spread.CellHorizontalAlignment.Center;
// 수직 정렬
fpSpread1.ActiveSheet.Columns[i].VerticalAlignment = FarPoint.Win.Spread.CellVerticalAlignment.Center;
}
fnSearch();
}
catch
{
MessageBox.Show("load error");
}
}
private void btn_asc_desc_Click(object sender, EventArgs e)
{
try
{
oc.Oracle_Conn_Fn();
if (sql_str == "SELECT * FROM TEST_SUBWAY ORDER BY SUBWAY_IDX DESC")
{
sql_str = "SELECT * FROM TEST_SUBWAY ORDER BY SUBWAY_IDX ASC";
}
else
{
sql_str = "SELECT * FROM TEST_SUBWAY ORDER BY SUBWAY_IDX DESC";
}
cmd = new OracleCommand(sql_str, oc.get_conn);
cmd.ExecuteReader();
ds = new DataSet();
oda = new OracleDataAdapter(sql_str, oc.get_conn);
oda.Fill(ds);
fpSpread1.DataSource = ds.Tables[0];
fpSpread1_Sheet1.Columns[0, 2].Width = 150; // 스프레드시트 셀 넓이 조절
fpSpread1_Sheet1.Columns[3, 4].Width = 327; // 스프레드시트 셀 넓이 조절
oc.get_conn.Close();
}
catch (Exception ex)
{
MessageBox.Show("filter error");
}
}
private void btn_update_Click(object sender, EventArgs e)
{
row_idx = fpSpread1.ActiveSheet.ActiveRowIndex; // 선택된 RowIndex 값
selected_idx_value = fpSpread1.ActiveSheet.Cells[row_idx, 0].Value.ToString(); // 해당 Row의 0번째 Column값
UPDATE_FORM frm = new UPDATE_FORM(); // 업데이트폼 생성
frm.pass_idx = selected_idx_value; // 찾은 idx값 UPDATE FORM의 pass_idx로값 넘기기
frm.Owner = this; // 부모폼과 자식폼 연결
frm.ShowDialog(); // 모달로 새 창 생성
}
private void btn_delete_Click(object sender, EventArgs e)
{
row_idx = fpSpread1.ActiveSheet.ActiveRowIndex; // 선택된 RowIndex 값
selected_idx_value = fpSpread1.ActiveSheet.Cells[row_idx, 0].Value.ToString(); // 해당 Row의 0번째 Column값
selected_name_value = fpSpread1.ActiveSheet.Cells[row_idx, 1].Value.ToString();
selected_line_value = fpSpread1.ActiveSheet.Cells[row_idx, 2].Value.ToString();
// if (MessageBox.Show("MessageBox 내용", "MessageBox 제목", MessageBoxButtons.YesNo) == DialogResult.Yes)
if (MessageBox.Show("IDX : " + selected_idx_value +
"\nNAME : " + selected_name_value +
"\nLINE : " + selected_line_value +
"\n\n삭제하시겠습니까?",
"DELETE BUTTON", MessageBoxButtons.YesNo) == DialogResult.Yes)
{
oc.Oracle_Conn_Fn();
sql_str = "DELETE TEST_SUBWAY WHERE SUBWAY_IDX = " + selected_idx_value + "";
cmd = new OracleCommand(sql_str, oc.get_conn);
cmd.ExecuteNonQuery();
}
oc.get_conn.Close();
fnSearch();
}
private void btn_insert_Click(object sender, EventArgs e)
{
INSERT_FORM frm = new INSERT_FORM(); // 새 폼 생성
frm.Owner = this; // 부모폼과 자식폼 연결
frm.ShowDialog(); // 모달로 새 창 생성
}
}
}
fpSpread1.Sheets[0].OperationMode = FarPoint.Win.Spread.OperationMode.SingleSelect; 는
위 그림처럼 셀 선택이 아닌
이처럼 하나의 행이 선택되게 만든다.
UPDATE
private void btn_update_Click(object sender, EventArgs e)
{
row_idx = fpSpread1.ActiveSheet.ActiveRowIndex; // 선택된 RowIndex 값
selected_idx_value = fpSpread1.ActiveSheet.Cells[row_idx, 0].Value.ToString(); // 해당 Row의 0번째 Column값
UPDATE_FORM frm = new UPDATE_FORM(); // 업데이트폼 생성
frm.pass_idx = selected_idx_value; // 찾은 idx값 UPDATE FORM의 pass_idx로값 넘기기
frm.Owner = this; // 부모폼과 자식폼 연결
frm.ShowDialog(); // 모달로 새 창 생성
}
UPDATE는 BASIC FORM에서 선택한 행의 IDX값을 추출해서 UPDATE FORM으로 보내주는 것이 중요하다.
(받은 IDX값으로 해당 정보를 불러올수가 있기 때문이다)
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;
using Oracle.DataAccess.Client;
namespace TEST
{
public partial class UPDATE_FORM : Form
{
protected internal string pass_idx;
Oracle_conn oc = new Oracle_conn();
OracleCommand cmd;
OracleDataReader reader;
string sqlstr;
string name;
string line;
string ll;
string rl;
// Start
string lsh;
string lsm;
string rsh;
string rsm;
// End
string leh;
string lem;
string reh;
string rem;
public UPDATE_FORM()
{
InitializeComponent();
}
private void UPDATE_FORM_Load(object sender, EventArgs e)
{
try
{
oc.Oracle_Conn_Fn();
sqlstr = "SELECT * FROM TEST_SUBWAY WHERE SUBWAY_IDX =" + pass_idx + "";
cmd = new OracleCommand(sqlstr, oc.get_conn);
reader = cmd.ExecuteReader();
if (reader.Read())
{
TB_SUBSAY_NAME.Text = reader.GetString(1);
LB_LINE.SelectedItem = reader.GetString(2);
string[] lt_info1 = reader.GetString(3).Split(' ');
TB_LEFT_LOCATION.Text = lt_info1[0];
TB_RIGHT_LOCATION.Text = lt_info1[7];
CB_LEFT_START_H.Text = lt_info1[3];
CB_LEFT_START_M.Text = lt_info1[5];
CB_RIGHT_START_H.Text = lt_info1[10];
CB_RIGHT_START_M.Text = lt_info1[12];
string[] lt_info2 = reader.GetString(4).Split(' ');
CB_LEFT_END_H.Text = lt_info2[3];
CB_LEFT_END_M.Text = lt_info2[5];
CB_RIGHT_END_H.Text = lt_info2[10];
CB_RIGHT_END_M.Text = lt_info2[12];
}
}
catch (Exception ex)
{
MessageBox.Show("update load error");
}
}
private void BTN_UPDATE_Click(object sender, EventArgs e)
{
try
{
name = TB_SUBSAY_NAME.Text;
line = LB_LINE.Text;
ll = TB_LEFT_LOCATION.Text;
rl = TB_RIGHT_LOCATION.Text;
lsh = CB_LEFT_START_H.Text;
lsm = CB_LEFT_START_M.Text;
rsh = CB_RIGHT_START_H.Text;
rsm = CB_RIGHT_START_M.Text;
leh = CB_LEFT_END_H.Text;
lem = CB_LEFT_END_M.Text;
reh = CB_RIGHT_END_H.Text;
rem = CB_RIGHT_END_M.Text;
oc.Oracle_Conn_Fn();
sqlstr = "UPDATE TEST_SUBWAY SET " +
"SUBWAY_NAME = '" + name + "', SUBWAY_LINE = '" + line + "', " +
"SUBWAY_START_TIME = '" + ll + " 방향 = " + lsh + " : " + lsm + " | " + rl + " 방향 = " + rsh + " : " + rsm + "', " +
"SUBWAY_END_TIME = '" + ll + " 방향 = " + leh + " : " + lem + " | " + rl + " 방향 = " + reh + " : " + rem + "' " +
"WHERE SUBWAY_IDX =" + pass_idx + "";
cmd = new OracleCommand(sqlstr, oc.get_conn);
cmd.ExecuteNonQuery();
MessageBox.Show("수정되었습니다");
((BASIC_FORM)this.Owner).fnSearch(); // 부모폼.메소드
oc.get_conn.Close();
}
catch (Exception ex)
{
MessageBox.Show("update error");
}
}
}
}
행을 선택 하고 [수 정] 버튼을 누르면 해당 행의 IDX값을 UPDATE FORM에 전달해서
해당 정보를 받을 수가 있다.
DELETE
private void btn_delete_Click(object sender, EventArgs e)
{
row_idx = fpSpread1.ActiveSheet.ActiveRowIndex; // 선택된 RowIndex 값
selected_idx_value = fpSpread1.ActiveSheet.Cells[row_idx, 0].Value.ToString(); // 해당 Row의 0번째 Column값
selected_name_value = fpSpread1.ActiveSheet.Cells[row_idx, 1].Value.ToString();
selected_line_value = fpSpread1.ActiveSheet.Cells[row_idx, 2].Value.ToString();
// if (MessageBox.Show("MessageBox 내용", "MessageBox 제목", MessageBoxButtons.YesNo) == DialogResult.Yes)
if (MessageBox.Show("IDX : " + selected_idx_value +
"\nNAME : " + selected_name_value +
"\nLINE : " + selected_line_value +
"\n\n삭제하시겠습니까?",
"DELETE BUTTON", MessageBoxButtons.YesNo) == DialogResult.Yes)
{
oc.Oracle_Conn_Fn();
sql_str = "DELETE TEST_SUBWAY WHERE SUBWAY_IDX = " + selected_idx_value + "";
cmd = new OracleCommand(sql_str, oc.get_conn);
cmd.ExecuteNonQuery();
}
oc.get_conn.Close();
fnSearch();
}
UPDATE에 비하면 DELETE는 간단하다.
DELETE도 UPDATE와 마찬가지로 선택한 행의 IDX값을 추출해서 삭제할 해당 데이터의 WHERE에 넣는다.
삭제를 누르면 MessageBox에 의해 예 / 아니오가 뜨며 예를 누르면 선택된 해당 행의 데이터는 삭제된다.
INSERT
private void btn_insert_Click(object sender, EventArgs e)
{
INSERT_FORM frm = new INSERT_FORM(); // 새 폼 생성
frm.Owner = this; // 부모폼과 자식폼 연결
frm.ShowDialog(); // 모달로 새 창 생성
}
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;
using Oracle.DataAccess.Client;
namespace TEST
{
public partial class INSERT_FORM : Form
{
Oracle_conn oc = new Oracle_conn();
OracleCommand cmd;
string sqlstr;
string name;
string line;
string ll;
string rl;
// Start
string lsh;
string lsm;
string rsh;
string rsm;
// End
string leh;
string lem;
string reh;
string rem;
public INSERT_FORM()
{
InitializeComponent();
}
private void BTN_INSERT_Click(object sender, EventArgs e)
{
try
{
name = TB_SUBSAY_NAME.Text;
line = LB_LINE.Text;
ll = TB_LEFT_LOCATION.Text;
rl = TB_RIGHT_LOCATION.Text;
lsh = CB_LEFT_START_H.Text;
lsm = CB_LEFT_START_M.Text;
rsh = CB_RIGHT_START_H.Text;
rsm = CB_RIGHT_START_M.Text;
leh = CB_LEFT_END_H.Text;
lem = CB_LEFT_END_M.Text;
reh = CB_RIGHT_END_H.Text;
rem = CB_RIGHT_END_M.Text;
if (name == string.Empty || line == string.Empty ||
ll == string.Empty || rl == string.Empty ||
lsh == string.Empty || lsm == string.Empty ||
rsh == string.Empty || rsm == string.Empty ||
leh == string.Empty || lem == string.Empty ||
reh == string.Empty || rem == string.Empty)
{
MessageBox.Show("빈칸 없이 입력해주세요");
return;
}
oc.Oracle_Conn_Fn();
sqlstr = "INSERT INTO TEST_SUBWAY VALUES(" +
"SUBWAY_IDX.NEXTVAL, '" + name + "', '" + line + "', '" +
"" + ll + " 방향 = " + lsh + " : " + lsm + " | " +
"" + rl + " 방향 = " + rsh + " : " + rsm + "', '" +
"" + ll + " 방향 = " + leh + " : " + lem + " | " +
"" + rl + " 방향 = " + reh + " : " + rem + "')";
cmd = new OracleCommand(sqlstr, oc.get_conn);
cmd.ExecuteNonQuery();
MessageBox.Show("정보가 입력되었습니다!");
oc.get_conn.Close();
((BASIC_FORM)this.Owner).fnSearch(); // 부모폼.메소드
}
catch (Exception ex)
{
MessageBox.Show("insert error");
}
}
}
}
INSERT도 간단하다. 넣을 정보만 입력할 수 있게 만들면 된다.
다만 SQL Query문 작성하는게 상당히 헷갈려서 짜증난다 , 혹은 '을 빠드리면 오류가 나기 때문이다.
정보를 이렇게 입력하고 INSERT 버튼을 누르면
MessageBox에 의해 정보가 입력되었다고 출력이 되고
입력한 정보가 실시간으로 등록이 되었다
'C# 개인 공부 기록용 > 개인 실습' 카테고리의 다른 글
Preference (Settings) + Xml (아이디 저장? 데이터 저장?) (0) | 2022.08.02 |
---|---|
SpreadSheet + Excel + Oracle + Xml (Synthesis Test) (0) | 2022.07.26 |
DataGridView + Selected (Cell, Row) (0) | 2022.07.18 |
XML + ORACLE DB + SQL QUERY (0) | 2022.07.13 |
Oracle DB Login Form + SQL QUERY (OracleConnection + SQL QUERY) (0) | 2022.07.11 |