using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;
namespace AdoConsole
{
class Ex13
{
static void Main(string[] args)
{
//1. 반환값이 없는 쿼리 : ExecuteNonQuery()
//2. 반환값이 있는 쿼리 : ExecuteReader()
// -> SqlDataReader의 사용법
M1();//***필수(단점 코딩이 길다) / 장점 가독성이 높다.
//M2();//응용
//M3();//응용 최적화
}
private static void M3()
{
//매니저 먼트에서 하는 행동은 c#에서 모두 가능하다.
//명령 객체를 재사용
// - 1개의 명령 객체를 가지고 여러개의 SQL 실행
SqlConnection con = new SqlConnection(Settings1.Default.ADONET);
con.Open();//연결
//매개변수 값이 다를때는 같은 매개변수 이름으로 주어서는 안된다.
//매개변수 값이 같다면 커멘드 객체를 하나만 만들도록 한다.
SqlCommand cmd1 = new SqlCommand();
cmd1.Connection = con;
cmd1.CommandText = "INSERT INTO tblAddress (name, age, email, address, tel) VALUES (@name, @age, @email, @address, @tel); UPDATE tblAddress SET age = @age2 WHERE seq = @seq;";
//매개변수 구성 따로 했던 작업을 하나의 작업으로 갯수 7개에 맞춰 만든다.
cmd1.Parameters.Add(new SqlParameter("@name", SqlDbType.NVarChar, 10));
cmd1.Parameters.Add(new SqlParameter("@age", SqlDbType.Int));//Int 생성자 오버로딩이 자동으로 되어있다.
cmd1.Parameters.Add(new SqlParameter("@age2", SqlDbType.Int));//Int 생성자 오버로딩이 자동으로 되어있다.
cmd1.Parameters.Add(new SqlParameter("@email", SqlDbType.VarChar, 50));
cmd1.Parameters.Add(new SqlParameter("@address", SqlDbType.VarChar, 200));
cmd1.Parameters.Add(new SqlParameter("@tel", SqlDbType.VarChar, 15));
cmd1.Parameters.Add(new SqlParameter("@seq", SqlDbType.Int));
cmd1.Parameters["@name"].Value = "가가가";//인덱서가 키값으로 사용할수 있게 만들어 놓았다.
cmd1.Parameters["@age"].Value = 20;
cmd1.Parameters["@age2"].Value = 99;
cmd1.Parameters["@seq"].Value = 9;
cmd1.Parameters["@email"].Value = "ga@ga.com";
cmd1.Parameters["@address"].Value = "서울시";
cmd1.Parameters["@tel"].Value = "010-14454-4545";
cmd1.ExecuteNonQuery();//실행
con.Close();//닫기
}
private static void M2()
{
//명령 객체를 재사용
// - 1개의 명령 객체를 가지고 여러개의 SQL 실행
SqlConnection con = new SqlConnection(Settings1.Default.ADONET);
con.Open();//연결
SqlCommand cmd1 = new SqlCommand();
cmd1.Connection = con;
cmd1.CommandText = "INSERT INTO tblAddress (name, age, email, address, tel) VALUES (@name, @age, @email, @address, @tel);";
//매개변수 구성
cmd1.Parameters.Add(new SqlParameter("@name", SqlDbType.NVarChar, 10));
cmd1.Parameters.Add(new SqlParameter("@age", SqlDbType.Int));//Int 생성자 오버로딩이 자동으로 되어있다.
cmd1.Parameters.Add(new SqlParameter("@email", SqlDbType.VarChar, 50));
cmd1.Parameters.Add(new SqlParameter("@address", SqlDbType.VarChar, 200));
cmd1.Parameters.Add(new SqlParameter("@tel", SqlDbType.VarChar, 15));
cmd1.Parameters["@name"].Value = "가가가";//인덱서가 키값으로 사용할수 있게 만들어 놓았다.
cmd1.Parameters["@age"].Value = 20;
cmd1.Parameters["@email"].Value = "ga@ga.com";
cmd1.Parameters["@address"].Value = "서울시";
cmd1.Parameters["@tel"].Value = "010-14454-4545";
cmd1.ExecuteNonQuery();
cmd1.Parameters.Remove(cmd1.Parameters["@name"]);
cmd1.Parameters.Remove(cmd1.Parameters["@email"]);
cmd1.Parameters.Remove(cmd1.Parameters["@address"]);
cmd1.Parameters.Remove(cmd1.Parameters["@tel"]);
//SqlCommand 재사용
//UPDATE 실행
// - 명령 객체를 재사용할때는 매개변수가 구성이 어떻게 되어있는지 확인해야 한다.
// 많은 매개 변수를 보유하고 있어도 남는것은 컴파일시 무시한다.
//총 6개의 매개변수가 있다.
cmd1.CommandText = "UPDATE tblAddress SET age = @age WHERE seq = @seq";
//cmd1.Parameters.Add(new SqlParameter("@age", SqlDbType.Int)); 이미 위 구문에서 만들어 놓았기 떄문에 삭제~
cmd1.Parameters.Add(new SqlParameter("@seq", SqlDbType.Int));
cmd1.Parameters["@age"].Value = 100;
cmd1.Parameters["@seq"].Value = 5;
cmd1.ExecuteNonQuery();
con.Close();//닫기
}
private static void M1()
{
//명령 객체를 재사용
// - 1개의 명령 객체를 가지고 여러개의 SQL 실행
SqlConnection con = new SqlConnection(Settings1.Default.ADONET);
con.Open();//연결
SqlCommand cmd1 = new SqlCommand();
cmd1.Connection = con;
cmd1.CommandText = "INSERT INTO tblAddress (name, age, email, address, tel) VALUES (@name, @age, @email, @address, @tel);";
//매개변수 구성
cmd1.Parameters.Add(new SqlParameter("@name", SqlDbType.NVarChar, 10));
cmd1.Parameters.Add(new SqlParameter("@age", SqlDbType.Int));//Int 생성자 오버로딩이 자동으로 되어있다.
cmd1.Parameters.Add(new SqlParameter("@email", SqlDbType.VarChar, 50));
cmd1.Parameters.Add(new SqlParameter("@address", SqlDbType.VarChar, 200));
cmd1.Parameters.Add(new SqlParameter("@tel", SqlDbType.VarChar, 15));
cmd1.Parameters["@name"].Value = "가가가";//인덱서가 키값으로 사용할수 있게 만들어 놓았다.
cmd1.Parameters["@age"].Value = 20;
cmd1.Parameters["@email"].Value = "ga@ga.com";
cmd1.Parameters["@address"].Value = "서울시";
cmd1.Parameters["@tel"].Value = "010-14454-4545";
cmd1.ExecuteNonQuery();
//2. Update 실행 : SQL쿼리가 같은 디비를 바라 본다면 기존에 있던것을 사용, DB가 다른곳에 있다면 커넥션 객체 다시 생성
//SqlConnection은 1개를 가지고 사용
// - database당 1개의 SqlConnection 사용
//SqlCommand은 재사용?
//A. 재사용 안함
// - 추가로 생성(SqlCommand 재생성)
SqlCommand cmd2 = new SqlCommand();
cmd2.Connection = con;//하나의 커넥션은 2개의 커맨드를 연결 할수 있다.
cmd2.CommandText = "UPDATE tblAddress SET age = @age WHERE seq = @seq";
cmd2.Parameters.Add(new SqlParameter("@age", SqlDbType.Int));
cmd2.Parameters.Add(new SqlParameter("@seq", SqlDbType.Int));
cmd2.Parameters["@age"].Value = 100;
cmd2.Parameters["@seq"].Value = 5;
cmd2.ExecuteNonQuery();
con.Close();//닫기
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;
namespace AdoConsole
{
class Ex14_Select
{
static void Main(string[] args)
{
//다중 결과셋 처리
// - SELECT의 결과가 2개 이상의 테이블 반환
// - 동시에 2개이상의 SELECT를 실행 SQL에서 SELECT * FROM tblAddress; SELECT * FROM tblAddress; 와 같은 효과
SqlConnection con = new SqlConnection(Settings1.Default.ADONET);
con.Open();
SqlCommand cmd = new SqlCommand();
cmd.Connection = con;
cmd.CommandText = "SELECT TOP 5 * FROM tblAddress ORDER BY regDate DESC; SELECT TOP 10 * FROM tblMelon";
//1개의 SELECT, 2개의 SELECT .. n개의 SELECT 가능
SqlDataReader reader = cmd.ExecuteReader();
//다중 결과셋의 reader의 동작
// - 처음엔 첫번쨰 결과셋을 대상으로 움직임 와일이 끝까지 돌아도 첫번째 결과만 리턴한다.
// - 다음 결과셋으로 이동하는 명령(그다음 테이블..)
// - 다음 결과셋을 대상으로 움직이면 된다.
while (reader.Read())
{
Console.WriteLine(reader[1].ToString());
}
//그 다음 결과 셋으로 이동(tblMelon)
//이러한 형태로 반드시 한다..
if (reader.NextResult())
{
while (reader.Read())
{
Console.WriteLine(reader[1].ToString());
}
}
con.Close();
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;
namespace AdoConsole
{
class Ex15_Select
{
static void Main(string[] args)
{
//SQL 명령을 실행합니다. 문구
//ExcuteNonQuery() : 반환값 X
//ExcuteReader() : 반환값 O SELECT
//ExcuteScalar() : ? SELECT(반환값이 있는 쿼리르 처리하는것)
//M1();
M2();
}
private static void M2()
{
SqlConnection con = new SqlConnection(Settings1.Default.ADONET);
con.Open();
SqlCommand cmd = new SqlCommand();
cmd.Connection = con;
//아래 쿼리 공통점 반환값이 1개인 경우 인쿼리
//SELECT max(age) FROM tblAddress;
//SELECT name FROM tblAddress WHERE age = (SELECT MAX(age) FROM tblAddress);
cmd.CommandText = "SELECT max(age) AS name FROM tblAddress;";
//SELECT 실행 스칼라는 첫번째 데이터를 직접 반환한다. 결과 테이블에 첫번쨰행 첫번쨰데이타 반환
int result = (int)cmd.ExecuteScalar();
//값이 하나였을때만 가능한 메소드다 스칼라는 단일!!!!!!!!!!!!!!
Console.WriteLine("{0}세 최고 어르신", result.ToString());
SqlDataReader reader = cmd.ExecuteReader();
//while (reader.Read())
//{
//반환값이 2개이상 일때
//}
con.Close();
}
private static void M1()
{
SqlConnection con = new SqlConnection(Settings1.Default.ADONET);
con.Open();
SqlCommand cmd = new SqlCommand();
cmd.Connection = con;
//아래 쿼리 공통점 반환값이 1개인 경우 인쿼리
//SELECT max(age) FROM tblAddress;
//SELECT name FROM tblAddress WHERE age = (SELECT MAX(age) FROM tblAddress);
cmd.CommandText = "SELECT max(age) AS name FROM tblAddress;";
SqlDataReader reader = cmd.ExecuteReader();
if (reader.Read())//다음칸으로 이동했는데 있으면 진행 없으면 진행 안함
{
Console.WriteLine("{0}세 최고 어르신", reader["name"].ToString());
}
//while (reader.Read())
//{
//반환값이 2개이상 일때
//}
con.Close();
}
}
}