我正在读取SQL Server表中的一行。其中一列是tinyint类型。C中的整数字节#
我想将值变成int或int32变量。
rdr.GetByte(j)
(byte) rdr.GetValue(j)
...似乎是检索值的唯一方法。但是,我如何将结果变成int
变量?
我正在读取SQL Server表中的一行。其中一列是tinyint类型。C中的整数字节#
我想将值变成int或int32变量。
rdr.GetByte(j)
(byte) rdr.GetValue(j)
...似乎是检索值的唯一方法。但是,我如何将结果变成int
变量?
int value = rdr.GetByte(j);
显式的转换是不需要的,因为一个byte
到int
是扩大转换(无数据丢失的可能性)。
铸造byte到int应该只是罚款:
int myInt = (int) rdr.GetByte(j);
由于C# supports implicit conversions from byte to int,则可以选择只是这样做:
int myInt = rdr.GetByte(j);
你选择哪一个是偏好的问题(不管你想要记录演员是否正在发生的事实)。请注意,您将需要显式转换,如果你想使用type inference,否则敏将错误类型:
var myInt = (int) rdr.GetByte(j);
(int)rdr.GetByte(j)
查看文档BitConverter.ToInt32(包含更多的例子):
byte[] bytes = { 0, 0, 0, 25 };
// If the system architecture is little-endian (that is, little end first),
// reverse the byte array.
if (BitConverter.IsLittleEndian)
Array.Reverse(bytes);
int i = BitConverter.ToInt32(bytes, 0);
Console.WriteLine("int: {0}", i);
// Output: int: 25
问题是如何将单个'byte'转换为'int'。 'BitConverter'处理'byte'数组,而不是单个'byte's。 – 2010-06-15 15:55:44
它仍然帮助我 – 2011-12-10 19:02:12
分配一个byte
到int
作品:
int myInt = myByte;
但是,也许你在里面有一个例外IDataRecord.GetByte
,在这种情况下,你应该检查你用来访问数据记录的索引是否指向tinyint
列。您可以检查从GetValue
返回的类型。对于tinyint
列,它应该是byte
。
Trace.Assert(rdr.GetValue(j).GetType() == typeof(byte));
另一个选择是放弃完全脆弱的数字索引:
int myInt = rdr.GetByte(rdr.GetOrdinal(TheNameOfTheTinyintColumn))
这类似于上公认的答案斯蒂芬·克利里的评论,但我需要指定为int的大小。这为我工作:
int value = Convert.ToInt32(rdr.GetValue(j));
(它也使用一个int提供的数据库列的向后兼容性。)
附:这是一个隐含的''字节'''int' – abatishchev 2010-06-15 15:54:01
我应该更具体。这是我已经尝试过的。我收到“指定的演员表无效”。例外。我也试过: int value =(int)rdr.GetByte(j) and int value = Convert.ToInt(rdrGetByte(j)) – jtb 2010-06-15 16:08:38
@jtb:在我看来,你没有得到带索引j的tinyint列。什么是异常堆栈跟踪?错误必须发生在'GetByte'里面。 – 2010-06-15 16:27:39