27

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?

7 Answers 7

28

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).

Sign up to request clarification or add additional context in comments.

4 Comments

P.S. This is an implicit cast byte to int
I should have been more specific. That is what I have already tried. I get a "Specified cast is not valid." exception. I have also tried: int value = (int) rdr.GetByte(j) and int value = Convert.ToInt(rdrGetByte(j))
@jtb: It seems to me then that you're not getting the tinyint column with the index j. What's the exception stack trace? The error must happen inside GetByte.
I agree with @Jordao; it sounds like column j is not a byte. Try int value = Convert.ToInt(rdr.GetValue(j));
14

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

1 Comment

The question is asking how to convert a single byte to an int. BitConverter deals with arrays of bytes, not single bytes.
6

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))

Comments

3

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);

Comments

2
(int)rdr.GetByte(j)

Comments

2

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);

Comments

1

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.)

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.