C# SqlCommand 클래스
SqlCommand 클래스는 SQL 서버에 어떤 명령을 내리기 위해 사용하는 클래스이다. SQL 테이블로부터 데이타를 가져오거나(SELECT), 테이블 내용을 삽입(INSERT), 갱신(UPDATE), 삭제(DELETE) 하기 위해 이 클래스를 사용할 수 있으며, 저장 프로시져 (Stored Procedure)를 사용할 때도 SqlCommand 를 사용한다. 아래 예제는 SELECT 문을 사용하여 SQL 서버의 [Finance] 테이블에서 데이타를 가져오는 명령을 실행한 예이다.
예제
string strConn = "Data Source=.;Initial Catalog=pubs;Integrated Security=SSPI;";
string sql = "SELECT * FROM Finance";
using(SqlConnection conn = new SqlConnection(strConn))
{
conn.Open();
// TSQL문장과 Connection 객체를 지정
SqlCommand cmd = new SqlCommand(sql, conn);
// 데이타는 서버에서 가져오도록 실행
SqlDataReader rdr = cmd.ExecuteReader();
}
SqlCommand.ExecuteNonQuery 사용
SqlCommand 클래스에서 SQL문과 Connection객체를 설정한 후 명령을 실행하는데, 이 때 데이타를 리턴 받을 것인지 혹은 어떤 데이타를 리턴 받을 것인지에 따라 다른 SqlCommand 메서드를 호출하게 된다. ExecuteNonQuery 메서드는 INSERT, UPDATE, DELETE 등의 DML 문장을 실행할 때 사용한다.
예제
string strConn = "Data Source=.;Initial Catalog=pubs;Integrated Security=SSPI;";
using(SqlConnection conn = new SqlConnection(strConn))
{
conn.Open();
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
cmd.CommandText = "INSERT Table1 VALUES(1, N'광화문')";
cmd.ExecuteNonQuery();
}
- TSQL에서 유니코드를 입력할 때는 문자열을 N’ ‘ 안에 넣는다.
SqlCommand.ExecuteReader 사용
SqlCommand를 통해 데이타를 서버에서 가져오기 위해서는 ExecuteReader()를 사용한다. 이 방식은 Connection-based 접근 방식으로 데이타베이스 Connection이 계속 연결된 상태를 유지한다. 이와 반대로 데이타를 한꺼번에 가져온 후, 서버 연결을 끊는 경우도 있는데, 이는 SqlDataAdapter를 이용해 구현한다. 일단 연결 상태에서 가져온 데이타는 SqlDataReader 라는 클래스의 객체로 리턴된다.
예제
string strConn = "Data Source=.;Initial Catalog=pubs;Integrated Security=SSPI;";
using(SqlConnection conn = new SqlConnection(strConn))
{
conn.Open();
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
cmd.CommandText = "SELECT * FROM Table1";
SqlDataReader rdr = cmd.ExecuteReader();
//... Display 데이타
}
SqlCommand.ExecuteScalar 사용
경우에 따라 리턴되는 데이타가 단 하나 Single Value인 경우가 있다. 이런 경우는 ExecuteScalar 메서드를 사용하면 간편하다. 리턴 값은 항상 object 타입으로 리턴되는데, 이를 맥락에 맞는 데이타 타입으로 Casting하여 사용한다. 아래 예는 테이블의 레코드수를 리턴받아 이를 int 타입으로 변환한 경우이다.
예제
string strConn = "Data Source=.;Initial Catalog=pubs;Integrated Security=SSPI;";
int count = 0;
using(SqlConnection conn = new SqlConnection(strConn))
{
conn.Open();
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
cmd.CommandText = "SELECT COUNT(*) FROM Table1";
object scalarValue = cmd.ExecuteScalar();
count = (int)scalarValue;
}
Console.WriteLine("레코드수 : {0}", count);
SqlCommand.ExecuteXmlReader 사용
XML형태로 데이타를 리턴 받는 경우는 ExecuteXmlReader 메서드를 사용한다. 이 메서드는 XmlReader 객체를 리턴한다. 아래 예는 XML컬럼(XmlData)의 데이타를 리턴받아 XmlReader를 사용해 XML 데이타를 사용하는 예이다.
예제
using System.Data.SqlClient;
using System.Xml;
using System.Diagnostics;
namespace CSSQL
{
class MySample
{
public void Sample1()
{
string strConn = "Data Source=(local);Initial Catalog=TestDB; Integrated Security=SSPI;";
using (SqlConnection conn = new SqlConnection(strConn))
{
conn.Open();
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
cmd.CommandText = "SELECT XmlData FROM TabX WHERE Id=1 FOR XML AUTO";
// XML 데이타를 리턴받아 XmlReader객체에 넣는다.
XmlReader xdr = cmd.ExecuteXmlReader();
xdr.MoveToContent();
Debug.WriteLine(xdr.ReadInnerXml());
}
}
}
}