실행 최적화 및 매개변수 전달

1. SqlConnection 연결 상태 판단

속성:conn.State

열거형 ConnectionState

// 연결이 열려있지 않으면 연결을 엽니다
if (conn.State != ConnectionState.Open)
{
    conn.Open();
}Code language: JavaScript (javascript)

참고:using과 함께 사용하면 연결이 해제된 뒤 상태가 자동으로 Closed로 바뀝니다.
자주 쓰이는 상태:Open / Closed / Connecting 등.

2. ExecuteScalar 널 값 판단 핵심 사항

ExecuteScalar 반환값을 검사해서 null로 인한 오류를 방지합니다

object obj = sqlCom.ExecuteScalar();

// null 과 DBNull.Value 둘 다 검사해야 합니다
if (obj == null || obj == System.DBNull.Value)
{
    MessageBox.Show("조회 결과가 null 입니다");
}
else
{
    MessageBox.Show(obj.ToString());
}Code language: JavaScript (javascript)

구분점:

  • null:반환된 데이터 행이 전혀 없음
  • DBNull.Value:행은 조회되었지만 해당 필드의 DB 값이 NULL

3. SqlCommand 매개변수 시스템(SQL 인젝션 방어 핵심)

1. 핵심 객체

SqlCommand.Parameters 컬렉션에 여러 SqlParameter 매개변수를 보관합니다.매개변수화 쿼리를 사용하면 SQL 인젝션 취약점을 완전히 차단할 수 있습니다.

2. 매개변수 생성 예시
// 매개변수 이름, 자료형, 크기
SqlParameter paramSql = new SqlParameter("@Title", SqlDbType.NVarChar, 250);

// 값 할당
paramSql.Value = model.Title;

// 명령 객체에 추가
sqlCom.Parameters.Add(paramSql);Code language: JavaScript (javascript)
3. 매개변수 방향 ParameterDirection(열거형)
paramSql.Direction = ParameterDirection.Output;
열거 멤버설명
Input1기본값,입력 매개변수(SQL에 값 전달)
Output2출력 매개변수,저장 프로시저 실행 후 결과를 가져옴
InputOutput3입력도 가능하고 실행 뒤 출력도 가능

전체 예제 코드

private void button1_Click(object sender, EventArgs e)
{
    string connectionString = "Data Source=.;Initial Catalog=db;User ID=sa;Password=xxx";
    using (SqlConnection conn = new SqlConnection(connectionString))
    {
        // 안전하게 연결 열기
        if (conn.State != ConnectionState.Open)
        {
            conn.Open();
        }

        SqlCommand sqlCom = new SqlCommand();
        sqlCom.Connection = conn;
        sqlCom.CommandTimeout = 60;
        // 문자열 합치지 말고 반드시 매개변수화 SQL 사용
        sqlCom.CommandText = "SELECT [Title] FROM [dbo].[Article] WHERE Title = @Title";

        // 매개변수 구성
        SqlParameter paramTitle = new SqlParameter("@Title", SqlDbType.NChar, 10);
        paramTitle.Value = "테스트 제목";
        sqlCom.Parameters.Add(paramTitle);

        object obj = sqlCom.ExecuteScalar();
        if (obj == null || obj == DBNull.Value)
        {
            MessageBox.Show("조회 결과가 null 입니다");
        }
        else
        {
            MessageBox.Show(obj.ToString());
        }
    }
}Code language: JavaScript (javascript)

중요 개발 규칙

  1. SQL 문자열 직접 연결 금지,항상 SqlParameter 로 매개변수화 처리;
  2. SqlConnectionSqlCommand는 가급적 using으로 자동 리소스 해제;
  3. ExecuteScalar 호출 시 반드시 null + DBNull.Value 둘 다 검사;
  4. CommandTimeout(SQL 실행 타임아웃)과 연결 문자열 안의 Connect Timeout(연결 수립 타임아웃)을 구분해야 한다.

실행 최적화 및 매개변수 전달

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다