如何在 C# 中从 MySQL 中检索 tinyint 的数据类型?
Posted
技术标签:
【中文标题】如何在 C# 中从 MySQL 中检索 tinyint 的数据类型?【英文标题】:How do I retrieve a data type of tinyint from MySQL in C#? 【发布时间】:2012-06-10 23:35:41 【问题描述】:所以在 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 这不会编译:表达式在此处键入 object + int
,但没有匹配的 +
运算符。
你试过int.Parse(reader["MyField"].ToString());
吗?
@Hans 这实际上可行……但为什么呢? ;-)
我描述的两种方法是在不同数据类型之间编程并实际取回值的最懒惰的方法。第一个将自动调用该对象到byte
、int
、double
、float
或long
的任何隐式转换,然后可以将其转换为int。第二个物理上获取对象的ToString()
,如果针对您的对象类型正确实现,则应该返回一串数字,int.Parse
应该能够将其读取为int
。这些方法不需要知道数据类型是什么,而是使用(可能效率低下)类型特定的方法。
【参考方案1】:
问题是由于强制转换和显式运算符:
(byte)objectExpression
与(byte)sbyteExpression
不同。
第一个是[direct] cast,它失败了,因为真实的对象类型是sbyte
而不是byte
。后者将执行 conversion 恰好使用显式运算符(“显式转换”),但不幸的是,仍然 看起来 像 [direct] cast 如上所述。这是一个失败的 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)
采用object
并使用一些魔法将其转换 为int。 (使用Convert.ToByte
可能会在溢出时引发异常。)
编码愉快!
【讨论】:
正确!要等 6 分钟。 +1,说真的,这一直困扰着我,让我一无所知,直到我读到这个答案!【参考方案2】:要确定正确的类型,请查看的值
reader["MyField"].GetType()
在调试器中。
【讨论】:
你的天才!让我看起来真快 (一个很好的评论......但它本身并没有回答“如何”......) 我试图帮助人们自助。 @webdad3 它提供了一种清晰的方法来找出代码的外观。除此之外,OP 还必须做一个小步骤来解决问题。 VS2017: "这个表达式会产生副作用,不会被计算"【参考方案3】:我可以建议让系统自行工作吗? DataReader 类提供了获取正确类型值的功能:
reader.GetInt32("id");
reader.GetByte("MyByteField");
这样,Reader 会为您提供您期望的类型。
【讨论】:
以上是关于如何在 C# 中从 MySQL 中检索 tinyint 的数据类型?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 C# 中从 SQL Server 数据库中检索数据?
如何在 PHP 中从 AUTO_INCREMENT 列中为每行检索生成的 PRIMARY KEY,并在 MySQL 中插入多行?