2010-06-15 38 views
9

我正在读取SQL Server表中的一行。其中一列是tinyint类型。C中的整数字节#

我想将值变成int或int32变量。

rdr.GetByte(j) 
(byte) rdr.GetValue(j) 

...似乎是检索值的唯一方法。但是,我如何将结果变成int变量?

回答

17

int value = rdr.GetByte(j);

显式的转换是不需要的,因为一个byteint是扩大转换(无数据丢失的可能性)。

+1

附:这是一个隐含的''字节'''int' – abatishchev 2010-06-15 15:54:01

+3

我应该更具体。这是我已经尝试过的。我收到“指定的演员表无效”。例外。我也试过: int value =(int)rdr.GetByte(j) and int value = Convert.ToInt(rdrGetByte(j)) – jtb 2010-06-15 16:08:38

+1

@jtb:在我看来,你没有得到带索引j的tinyint列。什么是异常堆栈跟踪?错误必须发生在'GetByte'里面。 – 2010-06-15 16:27:39

1

铸造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); 
10

查看文档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 
+1

问题是如何将单个'byte'转换为'int'。 'BitConverter'处理'byte'数组,而不是单个'byte's。 – 2010-06-15 15:55:44

+1

它仍然帮助我 – 2011-12-10 19:02:12

4

分配一个byteint作品:

int myInt = myByte; 

但是,也许你在里面有一个例外IDataRecord.GetByte,在这种情况下,你应该检查你用来访问数据记录的索引是否指向tinyint列。您可以检查从GetValue返回的类型。对于tinyint列,它应该是byte

Trace.Assert(rdr.GetValue(j).GetType() == typeof(byte)); 

另一个选择是放弃完全脆弱的数字索引:

int myInt = rdr.GetByte(rdr.GetOrdinal(TheNameOfTheTinyintColumn)) 
0

这类似于上公认的答案斯蒂芬·克利里的评论,但我需要指定为int的大小。这为我工作:

int value = Convert.ToInt32(rdr.GetValue(j)); 

(它也使用一个int提供的数据库列的向后兼容性。)