9

因此,在 C# 中,每当我从我的 MSSQL 数据库中检索到 tinyint 时,我都会使用以下演员表。

(int)(byte)reader["MyField"];

但是,该演员表似乎在 MySQL 中不起作用。

我试过的

(byte)reader["MyField"];

并且只是

(int)reader["MyField"];

编辑 1

例外

The specified cast is not valid.

编辑 2

这是数据类型。

{Name = "SByte" FullName = "System.SByte"}
4

3 回答 3

10

问题是由于强制转换和显式运算符:

(byte)objectExpressionis 与 不同(byte)sbyteExpression

第一个是 [direct]强制转换失败,因为真实对象类型 issbyte和 not byte。后者将执行恰好使用显式运算符(“显式转换”)的转换,不幸的是,它仍然看起来上面的 [直接]转换。这是一个失败的 sans-database 示例:

var obj = (object)(sbyte)0;
var i1 = (int)(sbyte)obj;  // okay: object (cast)-> sbyte (conversion)-> int
var i2 = (int)obj;         // fail: sbyte (cast)-> int (but sbyte is not int!)

要么使用(sbyte)objectExpression对真实对象类型有效的强制转换,要么使用Convert.ToInt32(objectExpression)anobject并做一些魔术其转换为 int。(使用Convert.ToByte可能会在溢出时引发异常。)

快乐编码!

于 2012-06-06T22:07:39.920 回答
10

要确定正确的类型,请查看

reader["MyField"].GetType()

在调试器中。

于 2012-06-06T22:01:25.497 回答
0

我可以建议让系统自相矛盾吗?DataReader 类提供了获取正确类型值的功能:

reader.GetInt32("id");
reader.GetByte("MyByteField");

这样,Reader 就会为您提供您期望的类型。

于 2021-02-23T14:53:45.473 回答