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;
| 열거 멤버 | 값 | 설명 |
|---|---|---|
| Input | 1 | 기본값,입력 매개변수(SQL에 값 전달) |
| Output | 2 | 출력 매개변수,저장 프로시저 실행 후 결과를 가져옴 |
| InputOutput | 3 | 입력도 가능하고 실행 뒤 출력도 가능 |
전체 예제 코드
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)
중요 개발 규칙
- SQL 문자열 직접 연결 금지,항상
SqlParameter로 매개변수화 처리; SqlConnection、SqlCommand는 가급적using으로 자동 리소스 해제;- ExecuteScalar 호출 시 반드시
null + DBNull.Value둘 다 검사; CommandTimeout(SQL 실행 타임아웃)과 연결 문자열 안의Connect Timeout(연결 수립 타임아웃)을 구분해야 한다.
실행 최적화 및 매개변수 전달
Previous: CommandTimeout
Next: ExecuteNonQuery