Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
vb.net中SQl Server smallint和int16可为空的Petapoco问题_Vb.net_Nullable_Petapoco - Fatal编程技术网

vb.net中SQl Server smallint和int16可为空的Petapoco问题

vb.net中SQl Server smallint和int16可为空的Petapoco问题,vb.net,nullable,petapoco,Vb.net,Nullable,Petapoco,我有一个带有视图和smallint字段的SQLServer表。从Petapoco T4 generator,视图中的所有数据都会自动标记为可为空,因为您无法在视图中指定它。 到目前为止,我对所有其他数据类型(guid、int、tinyint、string等)都很满意,但似乎可为null的smallint会导致一些问题 VB.NET中的T4生成器为SMALLINT字段创建以下内容: Private mPasswordResetDays As Integer? <Column&

我有一个带有视图和smallint字段的SQLServer表。从Petapoco T4 generator,视图中的所有数据都会自动标记为可为空,因为您无法在视图中指定它。 到目前为止,我对所有其他数据类型(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
从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命令上也注意到了类似的问题,但是行和代码不同

如果我从Integer更改类型?对于整数,使其不可为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
选择a.UserId,CAST(MIN(CAST(b.AllowPersistentCookie作为int))作为位作为AllowPersistentCookie,MAX(b.MinPasswordLenght)作为MinPasswordLenght,
转换(MAX(转换(b.NonAlphanumericPasswordChars为int))为位)转换为非alphanumericpasswordchars,转换(MAX(转换(b.alphanumericpasswords为int))为位)
作为AlphanumericPassword,MIN(b.PasswordResetDays)作为PasswordResetDays
来自dbo.EVA_UsersInRoles作为内部联接
dbo.EVA_作为b在a.RoleId=b.RoleId上的角色
其中(DATEDIFF(day,CONVERT(date,GETUTCDATE()),a.StartDate)=0)或
(DATEDIFF(day,CONVERT(date,GETUTCDATE()),a.StartDate)=0)和(a.StartDate为空)或
(a.EndDate为空)和(a.StartDate为空)
按a.UserId分组

可能是您使用表生成了代码,但现在您正在从视图中获取值。SQL必须从视图中将该列暗示为不可为空。

可能是您使用表生成了代码,但现在您正在从视图中获取值。SQL必须从视图中将列暗示为不可为空。

此问题的解决方案在

PetaPoco需要修补:


观点是转移注意力的东西;您可以通过将
int NULL
列返回为
uint?
或类似内容,在具体的表上重现此问题。

此问题的解决方案位于

PetaPoco需要修补:


观点是转移注意力的东西;您可以通过将
int NULL
列返回为
uint?
或类似内容,在具体的表上复制此属性。

据我所知,在SQL Server中无法将视图列表示为不可为NULL,但我认为此问题与从视图而不是从表中提取数据无关。问题只出现在smallint SQL Server数据类型上,其他数据类型也可以。因此,当直接从主表而不是视图访问可为null的smallint时,同样的问题也会出现。我可以试着回去报告,但似乎很合乎逻辑。我编辑了我的主要帖子,添加了视图。但正如我所说的,问题不在于视图,因为它必须返回一个可为null的smallint,问题在于PetaPoco在处理可为null的smallint/int16时。解决方案SQL Server端非常简单(只需在视图中强制转换为int或在基础表字段中更改为int),但我更希望修复PetaPoco。。。奇怪的是,在我之前没有人可以处理可为空的小整数:)就是这样!在将函数(Min、max、sum等)应用于列时,新列可能会更改结果类型。据我所知,在SQL Server中无法将视图列表示为不可为null,但我认为这个问题与从视图而不是从表中提取数据无关。问题只出现在smallint SQL Server数据类型上,其他数据类型也可以。因此,当直接从主表而不是视图访问可为null的smallint时,同样的问题也会出现。我可以试着回去报告,但似乎很合乎逻辑。我编辑了我的主要帖子,添加了视图。但正如我所说的,问题不在于视图,因为它必须返回一个可为null的smallint,问题在于PetaPoco在处理可为null的smallint/int16时。解决方案SQL Server端非常简单(只需在视图中强制转换为int或在基础表字段中更改为int),但我更希望修复PetaPoco。。。奇怪的是,在我之前没有人可以处理可为空的小整数:)就是这样!将函数(最小、最大、求和等)应用于列时,新列可能会更改结果类型
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
- converter = delegate(object src) { return Convert.ChangeType(src, dstType, null); };
+ var underlyingType = Nullable.GetUnderlyingType(dstType) ?? dstType;
+ converter = src => Convert.ChangeType(src, underlyingType, null);