web-dev-qa-db-fra.com

Octet en entier en C #

Je lis une ligne d'une table SQL Server. Une des colonnes est de type tinyint.

Je veux obtenir la valeur dans une variable int ou int32.

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

... semble être le seul moyen de récupérer la valeur. Mais comment obtenir le résultat dans une variable int?

12
jtb

int value = rdr.GetByte(j);

Un transtypage explicite n'est pas requis, car byte à int est une conversion en expansion (aucune possibilité de perte de données).

20
Stephen Cleary

Consultez la documentation de BitConverter.ToInt32 (contient d'autres exemples):

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
12
Dolph

Assigner une byte à une int fonctionne:

int myInt = myByte;

Mais peut-être que vous obtenez une exception à l'intérieur IDataRecord.GetByte, auquel cas vous devriez vérifier que l'index que vous utilisez pour accéder à l'enregistrement de données pointe réellement sur une colonne tinyint. Vous pouvez vérifier le type renvoyé par GetValue. Il devrait s'agir d'une byte pour une colonne tinyint.

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

Une autre option consiste à renoncer totalement à l'index numérique fragile:

int myInt = rdr.GetByte(rdr.GetOrdinal(TheNameOfTheTinyintColumn))
4
Jordão

Lancer l'octet en int devrait bien fonctionner:

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

Puisque C # prend en charge les conversions implicites d'octet en entier , vous pouvez également le faire:

int myInt = rdr.GetByte(j);

Le choix que vous choisissez est une question de préférence (que vous souhaitiez documenter le fait qu'une distribution ait lieu ou non). Notez que vous aurez besoin de la conversion explicite si vous voulez utiliser type inference , sinon myInt aura le type incorrect:

var myInt = (int) rdr.GetByte(j);
1
Heinzi
(int)rdr.GetByte(j)
1
abatishchev

Ceci est similaire au commentaire de Stephen Cleary sur la réponse acceptée, mais je suis tenu de spécifier la taille de l'int. Cela a fonctionné pour moi:

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

(Et il a également fourni une compatibilité ascendante avec une colonne de base de données utilisant un int.)

0
JoshSub