在我的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)
相同的代码运行得很好。
为什么“演员表无效”呢?为什么TINYINT
不能代替int
来阅读?{/ p>
答案 0 :(得分:5)
为什么不用TINYINT来代替int?
因为TINYINT
映射到short
或sbyte
。
编辑:Looked it up并且它是无符号字节,因此请使用byte
。
[Column]
public Nullable<byte> ChangeType;
您的堆栈跟踪显示Linq2Sql映射器调用.get_Int32()
。假设这类似于SqlDataReader.GetInt32()
,则意味着它将尝试读取32位值,不会应用任何转换。
答案 1 :(得分:4)
尝试使用
[Column]
public Nullable<Int32> ChangeType; //for int type
public Nullable<Int16> ChangeType; //for smallint type