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];
}
}
}
댓글
댓글 쓰기