2021년 목표설정

이미지
기본적으로 작년에 달성하지 못한 것들을 하려고 생각중인데..코로나가 언제까지 이어질지, 한국이나 북해도는 갈 수 있을지..자격증은 응시 가능할지..여러가지가 불확실하다. 2021년은 무엇보다 정신적인 부분과 경제적인 부분에 중점을 두고 조금 더 치열하게 지내보고 싶다. 일본나이로도 30대 마지막 해, 이제 불혹에 접어드는 나이..복잡하지만 심플하게. 육체적목표 : 트라이에슬론 스탠다드 도전하기 정신적 : 자격증2개 도전 + 자체개발 서비스 론칭 가족적 : 가정의 평화를 유지하기 경제적 : 외식과 유흥비를 줄이고 부수입을 늘려서 결과적으로 저축하기 사회적 : 목표세미나를 포함해서 민단과 개인인맥의 활성화와 교류를 촉진하기

[C#] Npgsql을 이용해서 CRUD 하는 방법

C#은 MSSQL하고 궁합이 좋다고들 하는데 비싸서..보통 프로젝트에는 무료DBMS를 사용하게 됨.

회사에서 자주 사용하는 건 PostgreSQL9 버전인데..옛날처럼 SQL문 그대로 때려박으면 때려박힌다..ㅋㅋ

ADO.NET이나 Entity Framework 를 사용해서 추상 개체 모델을 만들어 데이터를 핸들링 하라는데..

Postgre로 Eneity Framework를 해보려다가 포기랄까..실패 ㅋㅋ 

이유는 자동으로 모델을 만들어주는 방법이 있는데 중간에 계속 에러가 나더라..edmx 개념도 아직은 

핀트가 안 오고 ADO도 제대로 써본 적이 없어서..

동영상 강의를 찾아보니 ADO.NET 을 사용하는 방법이 더 자료가 많길래 따라하면서 학습했다.

어렵지는 않았지만..너무 프로그래밍 안하고 등한시 하다보니까 이런 게 신기하게 느껴지네 ㅎㅎ

이하 메모와 소스코드.

[개요]
  • PostgreSQL9.4 에 Npgsql로 접속 후, 테이블에 있는 내용을 Dataset으로 긁어와서 GridView에 출력
  • 문자열과 숫자 데이터를 입력해서 데이터를 추가(INSERT) 할 수 있음.
  • 그리드의 데이터를 선택해서 수정(UPDATE) 혹은 삭제(DELETE) 할 수 있음.
  • 새로고침(REFRESH) 버튼을 누르면 데이터를 최신상태(DB에 있는 내용)로 갱신한다.
[메모]
  • 솔루션 탐색기에서 [추가] -> [Nuget패키지] 들어가서 Npgsql을 검색해서 참조추가를 해야 함.
  • using Npgsql 필요
  • DB커넥션 개체등 필요에 의해 개체를 생성, Npgsql~이라는 이름이 붙어있음.
  • DB데이터를 조작하는 방법은 직접적인 방법(연결형)과 간접적인 방법(비연결형)이 있음.
  • 연결형은 데이터베이스 서버에 계속 붙어서 리얼타임으로 데이터를 처리하는 방식임.
  • 비연결형은 데이터베이스에서 데이터를 읽어와서 로컬의 메모리에 올려두고 데이터어뎁터와 데이터셋을 이용함.
  • @마크가 붙은 것은 파라메터로 DB에 질의를 할 때 복수의 데이터를 처리할 수 있으며 사용시 Parameters.Add로 추가함.
  • 기본 사용법은 SQL문을 문자열에 넣고 -> dataAdapter의 Command개체로 각 처리를 실행한 후 -> 결과를 dataSet에 받아 GridView에 DataSource로 설정해서 화면출력함.
  • CommandBuilder를 사용하면 위와 같은 과정을 자동으로 처리해준다. (원본소스 주석처리함.)
「인터페이스」



[소스코드 - form1.cs]
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Npgsql;

namespace SQLCommandTotal
{
    public partial class Form1 : Form
    {
        // Connector Definition
        string strConn = @"Server=localhost;Port=5432;Database=*******;User Id=******;Password=*******";
        NpgsqlConnection Conn;
        NpgsqlDataAdapter dataAdapter;
        DataSet dataSet;

        // table name val
        const string tableName = "testsql";

        // sqlBuilder
        NpgsqlCommandBuilder cmdBuilder;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            // Object Creation
            Conn = new NpgsqlConnection(strConn);
            dataAdapter = new NpgsqlDataAdapter("SELECT * FROM testsql",Conn);
            dataSet = new DataSet();
            cmdBuilder = new NpgsqlCommandBuilder(dataAdapter);

            //SqlCommandInit(); // No used with cmdBuilder

            dataAdapter.Fill(dataSet, tableName);
            dataGridView1.DataSource = dataSet.Tables[tableName];
        }


        //private void SqlCommandInit()     // No used with cmdBuilder
        //{
        //    // SELECT QUERY
        //    string strSelectSQL = "SELECT * FROM testsql";
        //    dataAdapter.SelectCommand = new NpgsqlCommand(strSelectSQL, Conn);

        //    // INSERT QUERY
        //    string strInsertSQL = "INSERT INTO testsql (val1,val2) VALUES (@vala,@valb)";
        //    dataAdapter.InsertCommand = new NpgsqlCommand(strInsertSQL, Conn);
        //    dataAdapter.InsertCommand.Parameters.Add("@vala", NpgsqlTypes.NpgsqlDbType.Char, 16, "val1");
        //    dataAdapter.InsertCommand.Parameters.Add("@valb", NpgsqlTypes.NpgsqlDbType.Integer, 0, "val2");

        //    // DELETE QUERY
        //    string strDeleteSQL = "DELETE FROM testsql WHERE key = @key";
        //    dataAdapter.DeleteCommand = new NpgsqlCommand(strDeleteSQL, Conn);
        //    dataAdapter.DeleteCommand.Parameters.Add("@key", NpgsqlTypes.NpgsqlDbType.Integer, 0, "key");

        //    // UPDATE QUERY
        //    string strUpdateSQL = "UPDATE testsql SET val1 = @vala, val2 = @valb WHERE @key = key";
        //    dataAdapter.UpdateCommand = new NpgsqlCommand(strUpdateSQL, Conn);
        //    dataAdapter.DeleteCommand.Parameters.Add("@key", NpgsqlTypes.NpgsqlDbType.Integer, 0, "key");
        //    dataAdapter.InsertCommand.Parameters.Add("@vala", NpgsqlTypes.NpgsqlDbType.Char, 16, "val1");
        //    dataAdapter.InsertCommand.Parameters.Add("@valb", NpgsqlTypes.NpgsqlDbType.Integer, 0, "val2");
        //}

        private void button1_Click(object sender, EventArgs e)
        {
            dataSet.Clear();
            dataAdapter.Fill(dataSet, tableName);
            DataRow NewRow = dataSet.Tables[tableName].NewRow();
            NewRow["val1"] = textBox1.Text;
            NewRow["val2"] = textBox2.Text;
            dataSet.Tables[tableName].Rows.Add(NewRow);
            dataAdapter.Update(dataSet, tableName);

            dataSet.Clear();
            dataAdapter.Fill(dataSet, tableName);
            dataGridView1.DataSource = dataSet.Tables[tableName];
         }

        private void button2_Click(object sender, EventArgs e)
        {
            int key = (int)dataGridView1.SelectedCells[0].Value;
            dataSet.Clear();
            dataAdapter.Fill(dataSet, tableName);

            string strFilter = "key=" + key;
            DataRow[] FindRow = dataSet.Tables[tableName].Select(strFilter);
            FindRow[0]["val1"] = textBox1.Text;
            FindRow[0]["val2"] = int.Parse(textBox2.Text);

            dataAdapter.Update(dataSet, tableName);
            dataSet.Clear();
            dataAdapter.Fill(dataSet, tableName);
            dataGridView1.DataSource = dataSet.Tables[tableName];
        }

        private void button3_Click(object sender, EventArgs e)
        {
            int key = (int)dataGridView1.CurrentRow.Cells["key"].Value;
            dataSet.Clear();
            dataAdapter.Fill(dataSet, tableName);

            string strFilter = "key=" + key;
            DataRow[] FindRow = dataSet.Tables[tableName].Select(strFilter);
            FindRow[0].Delete();

            dataAdapter.Update(dataSet, tableName);
            dataSet.Clear();
            dataAdapter.Fill(dataSet, tableName);
            dataGridView1.DataSource = dataSet.Tables[tableName];
        }

        private void button4_Click(object sender, EventArgs e)
        {
            dataSet.Clear();
            dataAdapter.Fill(dataSet, tableName);
            dataGridView1.DataSource = dataSet.Tables[tableName];
        }
    }
}

댓글

이 블로그의 인기 게시물

[메모] PostgreSQL에서 Insert 하는 경우 자동채번 PK가 중복에러 나는 경우

[C# & LINQ] 랜덤으로 데이터를 한 개 추출하는 방법

[react-native] uuid 생성이 에러가 날 때 대처법