2011-04-28 2 views
21

현재 데이터베이스의 모든 저장 프로 시저에 대해 간단한 C# 래퍼 클래스를 작성하려고합니다.System.Data.SqlClient.SqlParameter.IsNullable의 목적은 무엇입니까?

C#에서 일부 매개 변수를 작성하는 동안 속성 SqlParameter.IsNullable을 발견하고 이것이 무엇인지 궁금해했습니다. 지금까지 알고있는 한, 스토어드 프로 시저 매개 변수를 NOT NULL로 선언 할 수 없으므로 NULL은 항상 모든 매개 변수로 전달 될 수 있습니다.

테스트를 통해 IsNullable 속성을 false로 설정해도 아무런 영향이 없으며 여전히 SqlParameter.Value 속성을 null로 설정할 수 있습니다.

아무도이 속성의 목적을 설명 할 수 있습니까?

감사합니다. 이러한 링크를 검토해야 현상금을 찾고

답변자 :

How to restrict NULL as parameter to stored procedure SQL Server?

SQL Parameter IsNullable

I assume SqlParameter.IsNullable only makes sense when…?

http://social.msdn.microsoft.com/forums/en-US/vblanguage/thread/b7a08616-58d1-4cdc-a3e9-9353e292667b

+0

null 지시문없이 '저장된'proc 매개 변수를 정의하면 null을 전달할 수 없습니다 (db는 오류를 발생시킵니다) –

+1

@ M.R. null 지시어가 무슨 뜻인지 모르겠습니다. 즉, 기본값을 null로 설정하는 것입니까? @MyInt int = null이 'null 지시어'가 포함되거나 포함되지 않은 매개 변수 선언의 예를 제공 할 수 있습니까? – Martyn

+0

correct - @MyInt int vs @MyInt int = null. 당신이 이전을 할 때, 당신은 어쨌든 null을 건네 줄 수 없습니다 .... –

답변

3

링크보고 MSDN에 몇 가지 기사를 읽은 후.

SqlParameter.IsNullable Property 인터페이스 IDataParameter.IsNullable하고

DBNull 클래스는 하나의 인터페이스 방법 IConvertible.ToType 인프라 구현 "널 값이 DBNull이 클래스를 사용하여 처리됩니다"내용의 기사를 읽고을 구현합니다. 현재 DBNull 개체를 지정된 형식으로 변환합니다. "DBNull.Value은 데이터베이스 필드에 명시 적으로 존재하지 않는 값을 할당하는 데 사용될 수 있지만 대부분의 ADO.NET 데이터 공급자는 필드에 유효한 값이 없을 때 DBNull 값을 자동으로 할당합니다. 값 "

이는 ADO.NET 클래스의 가장 의미 읽기 자동으로이 속성을 구현하고 사진 뒤에 DBNull이에 NULL의 형식 변환을한다. 내 이해 당으로서, 나는 가정 오전 우리가 writing our own API 예 (System.Data.CustomDatabaseClient를하는 경우, 대신 System.Data.SqlClient) 연결 및 기타 데이터베이스 작업을 만들기 위해이 속성을 구현하지 않으면 System.Data.CustomDatabaseClient를 사용하는 모든 사용자가 Null 값을 명시 적으로 DBNull로 변환해야합니다.

의견을 찾고 및 보정

21

SqlParameter에 클래스는 IsNullable 재산의 공개 구현을 가지고

public abstract bool IsNullable {get; set;} 

그래서 SqlParameter 요구 사항을 정의하는 추상 기본 클래스 DbParameter에서 상속합니다. DbParameter 클래스는 System.Data에 포함 된 모든 데이터베이스 매개 변수 구현의 기본 클래스입니다.

프로 시저 또는 함수 매개 변수를 명시 적으로 허용 또는 거부하는 것으로 명시 적으로 허용 또는 거부 할 수있는 다른 DBMS가 있다고 가정해야합니다. SqlParameter.IsNullable은 SqlParameter가보다 일반적인 공용 데이터베이스 매개 변수 클래스와 인터페이스를 구현하기 때문에 존재합니다. 다른 .NET 데이터베이스 상호 작용 클래스와 공통입니다.

반사경을 보면 SqlParameter 클래스는 "InstanceDescriptor"로 변환 될 때 값을 전달하는 것 외에 IsNullable을 사용하지 않습니다. 나는 InstanceDescriptor 클래스가 사용되는 것을 파고 들지 않았지만 SqlCommand 클래스, 특히 BuildParamList 메서드를 확인했습니다. SqlParameterCollection을 데이터베이스로 전송 된 매개 변수의 SQL 문자열로 변환합니다.

BuildParamList 메서드는 SqlParameterCollection을 반복하고 StringBuilder을 사용하여 매개 변수 문자열을 작성합니다. BuildParamList은 구현시 어느 곳에서도 IsNullable 속성이나 값을 사용하지 않습니다. 사실 SqlParameter.IsNullable에 대한 참조는 SqlCommand 클래스의 어느 곳에 나타나지 않습니다.

SqlParameter 개체를 다른 클래스로 전달하는 일부 내부/개인 메서드에서 참조가 누락되었을 수 있지만 BuildParamList 메서드가이를 사용하지 않으면 문제가되지 않으므로 문제가되지 않습니다. SQL 문자열을 SQL Server로 보냅니다.

수행 한 테스트 사례 외에도 SqlCommand 클래스의 내용을 검토하면 SqlParameter.IsNullable 속성 값을 무시해도 안전하다는 결론을 뒷받침합니다.

SQL Server 측에서는 인터넷을 통해 빠른 검색을 통해 명시 적으로 nullable/nullable 프로 시저 또는 함수 매개 변수를 허용하는 DBMS를 찾을 수 있는지 확인했습니다. NULL 값을 전달할 수 있도록 프로 시저에 특정 속성을 설정해야하는 것처럼 보이는 DB2에 대한 참조를 실행했을 때 중지되었습니다. 나는이 기능이있는 현대의 RDBMS를 전혀 모르고 있으며 내 검색은 다른 것을 찾지 못했습니다.

+0

철저한 조사에 감사드립니다. 이것은 SqlParameter에 아무런 영향을 미치지 않는다고 생각합니다. 기본 인터페이스 때문에 구현 요구 사항 일뿐입니다.그것은 수치 스럽습니다 1) 문서가 이것을 말하지 않고 2) SQL Server가 항상 NULL을 전달할 수 있기 때문에 2) SQL Server에 대해 항상 올바르게 설정되어있는 것처럼 보이지는 않습니다. 따라서 이것을 검사하여 인터페이스에 대한 아이디어가 잘못되었습니다. –

+0

@ Ulty4life 명확히 해 주셔서 감사합니다. –