>백엔드 개발 >C#.Net 튜토리얼 >C#에서 SQL 매개변수에 null 값을 전달할 때 발생하는 오류 및 해결 방법

C#에서 SQL 매개변수에 null 값을 전달할 때 발생하는 오류 및 해결 방법

零下一度
零下一度원래의
2017-06-23 16:27:192010검색

C#의 Null은 SQL의 NULL과 다릅니다. SQL의 NULL은 C#에서 DBNull.Value로 표시됩니다.

참고: SQL 매개변수는 C#의 null 값을 허용할 수 없습니다. null이 전달되면 오류가 보고됩니다.

아래 예를 살펴보겠습니다.

1 SqlCommand cmd=new  SqlCommand("Insert into Student values(@StuName,@StuAge)" ,conn);2 cmd.parameters.add("@StuName" ,stuName);3 cmd.parameters.add("@StuAge" ,stuAge);4 cmd.ExecuteNonQuery();

위 코드는 문제가 없는 것 같습니다. 실제로 stuName 또는 stuAge 값이 null인 경우 예외가 발생합니다. 그렇다면 어떻게 해결해야 할까요?
해결 방법: stuName 또는 stuAge의 값이 null인 경우 DBNull.Value를 전달하세요. 다음으로, 전달된 매개변수 값을 판단하기 위해 공용 클래스에 정적 일반 메소드를 작성합니다. null이면 DBNull.Value를 반환하고, 그렇지 않으면 원래 값을 반환합니다.

 1 public static object SqlNull(object obj) 2 { 3   if(obj == null) 4   { 5     return DBNull.Value; 6   } 7   else 8   { 9     return obj;10   }    
11 }

위 메서드를 호출한 후의 코드는 다음과 같습니다.

1 SqlCommand cmd=new  SqlCommand("Insert into Student values(@StuName,@StuAge)" ,conn);2 cmd.parameters.add("@StuName" ,SqlNull(stuName));3 cmd.parameters.add("@StuAge" ,SqlNull(stuAge));4 cmd.ExecuteNonQuery();

또한 매개변수 값이 컨트롤(예: 텍스트 상자)의 값에서 오는 경우 전달된 매개변수 값은 null이어야 합니다(컨트롤의 값은 null이 아니기 때문에 값이 없더라도 ""가 됩니다). 컨트롤의 값이 ""(예: 입력된 문자가 없는 경우)인 경우 텍스트 상자에서) 데이터 테이블 필드 값이 NULL이면 SqlNull 메서드를 약간만 수정하면 됩니다.

 1 public static object SqlNull(object obj) 2 { 3    if(obj == null || obj.ToString() == "") 4    { 5      return DBNull.Value; 6    } 7    else 8    { 9      return obj;10    }    
11  }

확장:

다음과 같이 SQL 매개변수를 전달할 때 매개변수 그룹을 전달할 수도 있습니다.

 1 SqlParameter[] parm = new SqlParameter[] 2 { 3   new SqlParameter("@StuName", SqlNull(stuName)), 4   new SqlParameter("@StuAge", SqlNull(stuAge))  
 5 } 6 if(parm != null) 7 { 8   cmd.Parameters.AddRange(parm);   
 9 }10 cmd.ExecuteNonQuery();

참고: new SqlParameter(매개변수 이름, 매개변수 값)의 매개변수 값도 null 값을 허용하지 않으며, parm 매개변수 그룹도 null을 허용하지 않습니다. if(parm != null의 판단) ) 이보다 작을 수는 없습니다.

위 내용은 C#에서 SQL 매개변수에 null 값을 전달할 때 발생하는 오류 및 해결 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.