2013-10-02 2 views
3

SQLDataReader를 사용하여 데이터베이스에서 null 값을 검색하고 있습니다. SQL 데이터 판독기 - Null 열 값을 우아하게 처리하는 방법

Using cmd As DbCommand = store.GetStoredProcCommand("RetrievePOCO") 
    store.AddInParameter(cmd, "ID", DbType.Int32, ID) 
    Using reader As IDataReader = store.ExecuteReader(cmd) 
     If reader.Read() = True Then 
      Dim newPOCO As New POCO() 
      With newPOCO 
       'If the source column is null TryCast will return nothing without throwing an error 
       .StatusXML = TryCast(reader.GetString(reader.GetOrdinal("StatusXML")), String) 
       'How can a null integer or boolean be set elegantly? 
       .AppType = TryCast(reader.GetInt32(reader.GetOrdinal("AppType")), System.Nullable(Of Integer)) 
       .Archived = TryCast(reader.GetBoolean(reader.GetOrdinal("Archived")), Boolean) 

그래서 널 정수 또는 부울 우아한 방법을 설정할 수 있습니다 내가 널 문자열 값을 처리 할 수 ​​있지만 같은 트릭을 정수 또는 부울 작업을 얻을 수있는 방법을 일했다? C#에서 제안 사항을 보았지만 VB에서 올바르게 'TryCast 피연산자가 참조 유형이어야하지만 정수로 변환되지 않습니까? 값 유형 '컴파일러 오류입니다.

답변

3

당신은 SqlDataReader 개체의 IsDBNull 방법을 활용하고

.StatusXML = If(reader.IsDBNull(reader.GetOrdinal("StatusXML")), _ 
      "",reader.GetString(reader.GetOrdinal("StatusXML"))) 

그것은 당신이 전화를해야하기 때문에 매우 우아 한 라인이 아니라 당신의 마시고 개체에 기본값을 할당 할 VB.NET ternary operator을 사용할 수 있습니다 GetOrdinal 메서드를 곱합니다.

+0

네가 지적한 것처럼 네가 굉장히 우아하지는 않다. 나는 더 깔끔한 것이 있으면 좋겠다. –

5

나는이 시나리오에서는 다음과 같은 기능을 사용 :이 기능은 경우에 사용되어야하는 값을 전달하도록 요구하는

With newPOCO 
    .StatusXML = NoNull(reader("StatusXML"), "") 
    .AppType = NoNull(reader("AppType"), -1) 
    .Archived = NoNull(reader("Archived"), False) 
End With 

참고 :

Public Shared Function NoNull(ByVal checkValue As Object, ByVal returnIfNull As Object) As Object 
    If checkValue Is DBNull.Value Then 
     Return returnIfNull 
    Else 
     Return checkValue 
    End If 
End Function 

귀하의 코드는 다음과 같을 것 값은 두 번째 매개 변수로 DbNUll입니다.

+0

이 아이디어가 마음에 들었지만 함수의 "Return = checkValue"에서 "return checkValue"(minor)로 변경했습니다. – Darkloki

+0

@Darkloki : 변경했습니다. – dummy

0
Public Function NotNull(Of T)(ByVal Value As T, ByVal DefaultValue As T) As T 
    If Value Is Nothing OrElse IsDBNull(Value) Then 
     Return DefaultValue 
    Else 
     Return Value 
    End If 
End Function 
+1

이 코드가 질문에 대답 할 수 있지만 코드가 질문에 대답하는 방법 * 및이 경우 OP 질문에 대한 구현 단계도 제공해야합니다. – Grinn

관련 문제