본문 바로가기

C# 개인 공부 기록용/개인 실습

fpSpread Practice (SpreadSheet) + Xml + Oracle

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에 의해 정보가 입력되었다고 출력이 되고

 

입력한 정보가 실시간으로 등록이 되었다