1

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

CREATE VIEW MyView AS
(SELECT ChangeType FROM MyTable) UNION ALL
(SELECT NULL AS ChangeType FROM MyTable)

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

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

使用如下:

var table = dataContext.GetTable<MyView>();
var elements = table.ToArray();

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

[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

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

(SELECT CONVERT(INT,NULL) AS ChangeType FROM MyTable)

相同的代码运行得很好。

为什么那里的“演员无效”?为什么不将TINYINTjust 代替阅读int

4

2 回答 2

5

为什么不只读取 TINYINT 来代替 int?

因为TINYINT映射到shortsbyte

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

[Column]
public Nullable<byte> ChangeType; 

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

于 2012-10-08T11:49:40.437 回答
4

尝试使用

[Column]
    public Nullable<Int32> ChangeType; //for int type
    public Nullable<Int16> ChangeType; //for smallint type
于 2012-10-08T11:50:15.967 回答