2013-05-08 8 views
1

보기 및 smallint 필드가있는 SQL Server 테이블이 있습니다. 뷰의 모든 데이터는 뷰에서 지정할 수 없으므로 Petapoco T4 생성기에서 자동으로 nullable로 표시됩니다. 지금까지 (guid, int, tinyint, string 등) 다른 모든 데이터 유형은 정상이지만 nullable smallint가 문제를 일으키는 것으로 보입니다.nullable SQl 서버와 Petapoco 문제 smallint 및 int16 in vb.net

Private mPasswordResetDays As Integer? 
    <Column> _ 
    Public Property PasswordResetDays() As Integer? 
     Get 
      Return mPasswordResetDays 
     End Get 
     Set 
      mPasswordResetDays = Value 
     End Set 
    End Property 

하지만 예외 수신 :

VB.NET에서 T4 발생기는 SMALLINT 필드 이것을 생성 System.Nullable`1 '에서'System.Int16 '[발

캐스트 [선택 System.Int32, mscorlib에, 버전 4.0.0.0 = 문화 = 중립 PublicKeyToken = b77a5c561934e089]] 2677 Petapoco 줄에

:

Line 2675:  else 
Line 2676:  { 
Line 2677:   converter = src => Convert.ChangeType(src, dstType, null); 
Line 2678:  } 
Line 2679:   } 
01,235,164 는 SQL 명령 PetaPoco에서 실행

은 매우 간단합니다 :

SQL Command: SELECT UserId, AllowPersistentCookie, MinPasswordLenght, 
NonAlphanumericPasswordChars, AlphanumericPassword, PasswordResetDays FROM 
EVA_vw_UserLoginStatusFromRoles 
WHERE UserId = @0 -> @0 [String] = "d85674ab-d389-4548-ad89-5322892ca0e2" 

나는 비슷한 문제가 null을 반환 ExecuteScalar는 명령에 언급 된 생각하지만 선은 다른과 코드도.

유형을 정수로 변경하면 어떻게됩니까? 정수로, nullable되지 않도록 모든 것이 잘 작동합니다.

Petapoco 및 SQL Server Smallints에 대한이 힌트에 대한 힌트가 있습니까?

칙은 : 뷰 코드는 다음과 같습니다

SELECT  a.UserId, CAST(MIN(CAST(b.AllowPersistentCookie AS int)) AS bit) AS AllowPersistentCookie, MAX(b.MinPasswordLenght) AS MinPasswordLenght, 
        CAST(MAX(CAST(b.NonAlphanumericPasswordChars AS int)) AS bit) AS NonAlphanumericPasswordChars, CAST(MAX(CAST(b.AlphanumericPassword AS int)) AS bit) 
        AS AlphanumericPassword, MIN(b.PasswordResetDays) AS PasswordResetDays 
FROM   dbo.EVA_UsersInRoles AS a INNER JOIN 
        dbo.EVA_Roles AS b ON a.RoleId = b.RoleId 
WHERE  (DATEDIFF(day, CONVERT(date, GETUTCDATE()), a.StartDate) <= 0) AND (DATEDIFF(day, CONVERT(date, GETUTCDATE()), a.EndDate) >= 0) OR 
        (DATEDIFF(day, CONVERT(date, GETUTCDATE()), a.StartDate) <= 0) AND (a.EndDate IS NULL) OR 
        (DATEDIFF(day, CONVERT(date, GETUTCDATE()), a.EndDate) >= 0) AND (a.StartDate IS NULL) OR 
        (a.EndDate IS NULL) AND (a.StartDate IS NULL) 
GROUP BY a.UserId 

답변

0

그것은 당신이 테이블을 사용하여 코드를 생성하지만 지금은 당신이보기에서 값을 가져 오는 것을 솔기. SQL은 열에서 뷰에서 Null이 허용되지 않는 것으로 암시되어야합니다. 이 플러스 솔루션

+0

내가 아는 한 뷰 열을 SQL Server에서 null이 아닌 것으로 표현하는 방법은 없지만이 문제는 테이블 대신보기에서 데이터를 추출하는 것과 관련이 없다고 생각합니다. 문제는 smallint SQL Server 데이터 유형에서만 발생하며 다른 데이터 유형에서도 문제가 없습니다. 따라서 뷰 대신 기본 테이블에서 직접 nullable smallint에 액세스 할 때 같은 문제가 발생합니다. 내가 다시 시도해 볼 수는 있지만 꽤 논리적 인 것처럼 보인다. – Manight

+0

보기 코드를 게시 할 수 있습니까? –

+0

물론입니다. 내 메인 포스트를 편집하여보기를 추가했습니다. 그러나 문제는 Nullable smallint를 반환해야하기 때문에 뷰에 문제가 없다고 했으므로 문제는 PetaPoco가 nullable smallint/int16을 처리 할 때 발생합니다. 해결 방법 SQL Server 측은 매우 간단합니다 (뷰에 int로 캐스트하거나 기본 테이블 필드로 int로 변환). 그러나 PetaPoco에 대한 수정을 선호합니다 ... 이전에는 아무도 처리 할 Nullable smallint가 없었습니다. – Manight

1

문제가 https://github.com/toptensoftware/PetaPoco/issues/153

PetaPoco에있다가와 패치 필요가 :

- converter = delegate(object src) { return Convert.ChangeType(src, dstType, null); }; 
+ var underlyingType = Nullable.GetUnderlyingType(dstType) ?? dstType; 
+ converter = src => Convert.ChangeType(src, underlyingType, null); 

조회수가 붉은 청어입니다; int NULL 열을 uint? 또는 그와 비슷한 것으로 반환하여 콘크리트 테이블에서이를 재현 할 수 있습니다.

+1

이것은 현재 버전에서 이미 수정되었습니다. –