如何在C#中从MySQL检索tinyint数据类型?

10

在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"}

你尝试过 reader["MyField"] + 0; 吗? - Hans Z
@Hans 无法编译:表达式被类型化为object + int,其中没有匹配的+运算符。 - user166390
你尝试过 int.Parse(reader["MyField"].ToString()); 吗? - Hans Z
1
@Hans 那确实可以...但为什么呢?;-) - user166390
1
我所描述的两种方法是在不同数据类型之间进行编程并实际获取值的最懒惰的方式。第一种方法将自动调用任何隐式转换,将对象转换为byteintdoublefloatlong,然后可以将其转换为int。第二种方法物理上获取对象的ToString(),如果针对您的对象类型正确实现,则应返回一串数字字符串,int.Parse应该能够读取为int。这些方法不需要了解数据类型是什么,而是使用(可能效率低下的)特定于类型的方法。 - Hans Z
是的,最后一个也适用于 Nullable<T> - Hans Z
3个回答

10

为确定正确的类型,请查看值

reader["MyField"].GetType()

在调试器中。


2
你真是个天才!让我快速看一下 - Steven Combs
3
一个很好的评论...但它本身并没有回答“如何做到”的问题... - user166390
8
我试图帮助人们帮助自己。 - usr
@webdad3它提供了一种清晰的方法来找出代码应该看起来像什么。除此之外,OP还需要额外迈出一小步来解决问题。 - usr
VS2017: "此表达式会产生副作用,因此不会被评估" - quilkin
@quilkin 当调试器拒绝评估表达式时,可能会出现该消息。实际程序是正常的。 - usr

10
问题在于由于强制类型转换和显式操作符的存在:
(byte)objectExpression不同于(byte)sbyteExpression。
前者是一个[直接]cast,但由于真实的对象类型是sbyte而不是byte,故失败了。后者将执行一个转换,只是恰好使用了一个显式操作符("Explicit Conversion"),其语法很不幸地仍然看起来像[直接]cast。以下是一个无需数据库的失败示例。
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),它接受一个 object 并执行一些魔法将其转换为 int。(使用 Convert.ToByte 可能会在溢出时引发异常。)
祝编码愉快!

正确!必须等待6分钟。 - Steven Combs
1
+1,说真的这一直困扰着我,让我感到无助,直到我读到了这个答案! - nawfal

0

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

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

这样,Reader 就会提供你所期望的类型。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接