2010-06-15 30 views
9

Estoy leyendo una fila de una tabla de SQL Server. Una de las columnas es de tipo tinyint.Byte a entero en C#

Quiero obtener el valor en una variable int o int32.

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

... parece ser la única forma de recuperar el valor. ¿Pero cómo obtengo el resultado en una variable int?

Respuesta

17

int value = rdr.GetByte(j);

una conversión explícita no es necesaria, porque un byte a int es una conversión de ampliación (sin posibilidad de pérdida de datos).

+1

P. S. Este es un molde implícito 'byte' a' int' – abatishchev

+3

Debería haber sido más específico. Eso es lo que ya he intentado. Obtengo un "Lanzamiento especificado no es válido". excepción. También he intentado: valor int = (int) rdr.GetByte (j) y int value = Convert.ToInt (rdrGetByte (j)) – jtb

+1

@jtb: Me parece entonces que usted no está recibiendo el columna minúscula con el índice j.¿Cuál es el rastro de la pila de la excepción? El error debe ocurrir dentro de 'GetByte'. –

1

casting el byte a int debería funcionar bien:

int myInt = (int) rdr.GetByte(j); 

Desde C# supports implicit conversions from byte to int, alternativamente puede simplemente hacer esto:

int myInt = rdr.GetByte(j); 

Que uno elige es una cuestión de preferencia (si usted quiero documentar el hecho de que un elenco está teniendo lugar o no). Tenga en cuenta que necesitará la conversión explícita si desea utilizar type inference, o de otra manera myInt tendrá el tipo incorrecto:

var myInt = (int) rdr.GetByte(j); 
10

consulte la documentación de BitConverter.ToInt32 (contiene más ejemplos):

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

La pregunta es cómo convertir un solo 'byte' a' int'. 'BitConverter' trata con arreglos de' byte 's, no solo' byte's. –

+1

todavía me ayudó –

4

la asignación de un byte a un int obras:

int myInt = myByte; 

Pero tal vez está obteniendo una excepción dentro deIDataRecord.GetByte, en cuyo caso debe verificar que el índice que está utilizando para acceder al registro de datos realmente apunta a una columna tinyint. Puede verificar el tipo devuelto desde GetValue. Debe ser byte para una columna tinyint.

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

Otra opción es renunciar al índice numérico frágil por completo:

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

Esto es similar al comentario de Stephen Cleary en la respuesta aceptada, sin embargo estoy obligado a especificar el tamaño de la int. Esto funcionó para mí:

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

(Y también proporciona compatibilidad hacia atrás con una columna de base de datos utilizando un int.)