所以在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"}
答案 0 :(得分:10)
要确定正确的类型,请查看
的值reader["MyField"].GetType()
在调试器中。
答案 1 :(得分:8)
问题在于由于强制转换和显式运算符:
(byte)objectExpression
与(byte)sbyteExpression
不同。
第一个是[direct] cast ,它失败了,因为真实对象类型是sbyte
而不是byte
。后者将执行转换恰好使用显式运算符(“显式转换”),其语法不幸地仍然看起来像[direct] 按照上面的方式投射。这是一个失败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
可能会在溢出时抛出异常。)
快乐的编码!
答案 2 :(得分:0)
我可以建议让系统自行工作吗? DataReader 类提供了获取正确值类型的功能:
reader.GetInt32("id");
reader.GetByte("MyByteField");
通过这种方式,阅读器会为您提供您期望的类型。