1

ビューと smallint フィールドを持つ SQL Server テーブルがあります。ビュー内のすべてのデータは、ビュー内で指定できないため、Petapoco T4 ジェネレーターから自動的に null 可能としてマークされます。これまでのところ、他のすべてのデータ型 (guid、int、tinyint、string など) には問題ありませんが、null 許容の smallint がいくつかの問題を引き起こしているようです。

VB.NET の T4 ジェネレーターは、SMALLINT フィールドに対してこれを作成します。

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

しかし、私は例外を受け取ります:

「System.Int16」から「System.Nullable`1[[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]」へのキャスト

ペタポコ ライン 2677:

Line 2675:       else
Line 2676:       {
Line 2677:          converter = src => Convert.ChangeType(src, dstType, null);
Line 2678:       }
Line 2679:            }

PetaPoco から実行される SQL コマンドは非常に単純です。

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 コマンドでも同様の問題が指摘されていると思いますが、行が異なり、コードも異なります。

タイプを整数から変更したら?整数に変換し、null 不可にすると、すべて正常に動作します。

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
4

2 に答える 2

0

テーブルを使用してコードを生成したようですが、ビューから値を取得しています。SQL は、列をビューから null 非許容としてヒントしている必要があります。

于 2013-05-08T16:36:16.517 に答える