jtb
jtb

Reputation: 397

Byte to integer in C#

I am reading a row from a SQL Server table. One of the columns is of type tinyint.

I want to get the value into an int or int32 variable.

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

...seems to be the only way to retrieve the value. But how do I get the result into an int variable?

Upvotes: 27

Views: 97842

Answers (7)

Paul Carlton
Paul Carlton

Reputation: 2993

Quick tidbit I ran into as a kind of corner case. If you have an object type that is of type System.Byte, you can not directly cast to int. You must first cast to a byte, then cast to an int.

public int Method(object myByte)
{
    // will throw a cast exception
    // var val = (int)myInt;

    // will not throw a cast exception
    var val = (int)((byte)myInt)
    return val;
}

Method((byte)1);

Upvotes: 3

Jordão
Jordão

Reputation: 56477

Assigning a byte to an int works:

int myInt = myByte;

But maybe you're getting an exception inside IDataRecord.GetByte, in which case you should check that the index you're using to access the data record really points to a tinyint column. You can check the type returned from GetValue. It should be a byte for a tinyint column.

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

Another option is to forego the fragile numeric index altogether:

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

Upvotes: 6

JoshSub
JoshSub

Reputation: 509

This is similar to Stephen Cleary's comment on the accepted answer, however I am required to specify the size of the int. This worked for me:

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

(And it also provided backward compatibility with a database column using an int.)

Upvotes: 1

Heinzi
Heinzi

Reputation: 172320

Casting the byte to int should work just fine:

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

Since C# supports implicit conversions from byte to int, you can alternatively just do this:

int myInt = rdr.GetByte(j);

Which one you choose is a matter of preference (whether you want to document the fact that a cast is taking place or not). Note that you will need the explicit cast if you want to use type inference, or otherwise myInt will have the wrong type:

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

Upvotes: 2

Stephen Cleary
Stephen Cleary

Reputation: 456707

int value = rdr.GetByte(j);

An explicit cast is not required, because a byte to int is a widening conversion (no possibility of data loss).

Upvotes: 28

Dolph
Dolph

Reputation: 50670

See the documentation for BitConverter.ToInt32 (contains more examples):

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

Upvotes: 15

abatishchev
abatishchev

Reputation: 100288

(int)rdr.GetByte(j)

Upvotes: 2

Related Questions