views:

119

answers:

5

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 I can't figure out how to get the result into an int var.

+8  A: 

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

Stephen Cleary
P.S. This is an implicit cast `byte` to `int`
abatishchev
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
@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`.
Jordão
I agree with @Jordao; it sounds like column `j` is not a `byte`. Try `int value = Convert.ToInt(rdr.GetValue(j));`
Stephen Cleary
+2  A: 

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);
Heinzi
+1  A: 
(int)rdr.GetByte(j)
abatishchev
+1  A: 

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
Dolph
The question is asking how to convert a single `byte` to an `int`. `BitConverter` deals with arrays of `byte`s, not single `byte`s.
Stephen Cleary
+1  A: 

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 form 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))
Jordão