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

次のようにの2番目の部分を変更した場合UNION

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

同じコードが問題なく実行されます。

なぜその「キャストは無効」なのですか?なぜTINYINT代わりにただ読まれないのintですか?

4

2 に答える 2

5

intの代わりにTINYINTが読み取られないのはなぜですか?

またはのいずれかTINYINTにマップするため。shortsbyte

編集:調べたところ、符号なしバイトなので、を使用しますbyte

[Column]
public Nullable<byte> ChangeType; 

スタックトレースは、Linq2Sqlマッパーがを呼び出すことを示しています.get_Int32()。これがそのときと似ていると仮定するとSqlDataReader.GetInt32()、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 に答える