Reputation: 397
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
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
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
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
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
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
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