将null值作为Nullable <int>返回时,"指定的强制转换无效"

sha*_*oth 1 .net c# sql-server linq-to-sql

在我的SQL数据库中,我有以下视图:

CREATE VIEW MyView AS
(SELECT ChangeType FROM MyTable) UNION ALL
(SELECT NULL AS ChangeType FROM MyTable)
Run Code Online (Sandbox Code Playgroud)

哪里ChangeType有类型TINYINT.然后在我的C#代码中,我有一个以下类:

[Table(Name = "MyView")]
public class MyView
{
    [Column]
    public Nullable<int> ChangeType;
}
Run Code Online (Sandbox Code Playgroud)

使用如下:

var table = dataContext.GetTable<MyView>();
var elements = table.ToArray();
Run Code Online (Sandbox Code Playgroud)

当这段代码运行时,我得到以下异常:

[InvalidCastException: Specified cast is not valid.]
System.Data.SqlClient.SqlBuffer.get_Int32() +6393860
Read_MyView(ObjectMaterializer`1 ) +3404
System.Data.Linq.SqlClient.ObjectReader`2.MoveNext() +42
System.Linq.Buffer`1..ctor(IEnumerable`1 source) +488
System.Linq.Enumerable.ToArray(IEnumerable`1 source) +104
MyCodeHere
Run Code Online (Sandbox Code Playgroud)

如果我更改第二部分UNION如下:

(SELECT CONVERT(INT,NULL) AS ChangeType FROM MyTable)
Run Code Online (Sandbox Code Playgroud)

相同的代码运行得很好.

为什么那个"演员阵容无效"呢?为什么不能TINYINT代替它int

Hen*_*man 5

为什么TINYINT不能代替int读取?

因为TINYINT映射到shortsbyte.

编辑:查看,它是一个无符号字节,所以使用byte.

[Column]
public Nullable<byte> ChangeType; 
Run Code Online (Sandbox Code Playgroud)

堆栈跟踪显示Linq2Sql映射器调用.get_Int32().假设这与此类似,SqlDataReader.GetInt32()则意味着它将尝试读取32位值,不应用任何转换.