본문 바로가기

   
Programming/ADO.NET

명령 객체 재사용, 다중 결과셋 처리, 단일 결과셋 처리

반응형



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();

             }

       }

}

 

 


 

반응형