ConvertToInt16

S

SimonZ

If I have for example next select statement in SQL stored procedure:

CREATE PROCEDURE test
as
SELECT 1 as dataNumber

If I read this number with dataReader

Int16 dataNumber
dataNumber=rdr.GetInt16(0);

I get an error - invalid cast.

If I use convert function than it works:

dataNumber=Convert.ToInt16(rdr.GetInt32(0));

Why? It seems that even If I return small number from database (1 in my
case), it consider it as int32.

I would like to do the same without convert function.

Any idea?

regards,S
 
M

Marc Gravell

The problem here is that most databases will use the int (32-bit) SQL
data-type.

If you really want a 16-bit number, you need to let the server know; you
could (under SQL-Server, at least), use:

SELECT CAST(1 as smallint) as dataNumber

Or just live with the Convert ;-p

Marc
 
S

SimonZ

Hi, Marc

it's really funny.

If I have tinyInt nothing works.

dataNumber=rdr.GetInt16(0);

dataNumber=rdr.GetInt32(0);

dataNumber=rdr.GetSqlInt16(0);

All return error.

It works only:
dataNumber=Convert.ToInt16(rdr.GetValue(0));

I haven't try with smallInt. I'll try with that. The problem is that I have
to change dataType in my database because of that.

Regards,
S
 
J

Jon Skeet [C# MVP]

SimonZ said:
If I have tinyInt nothing works.

dataNumber=rdr.GetInt16(0);

dataNumber=rdr.GetInt32(0);

dataNumber=rdr.GetSqlInt16(0);

All return error.

Yes, they would. TinyInt is a byte - so try rdr.GetByte(0).

Jon
 
I

Ignacio Machin \( .NET/ C# MVP \)

Hi,

I haven't try with smallInt. I'll try with that. The problem is that I
have to change dataType in my database because of that.

If you take a look at the SqlDbType enum description in MSDN you will get a
nice table of the type, and the C# type associated. This is the cast that
will work.

In your case TinyInt is a byte, not an int16, the int16 is smallInt.

What is wrong with Convert in the first place?
 
?

=?ISO-8859-1?Q?Lasse_V=E5gs=E6ther_Karlsen?=

SimonZ said:
If I have for example next select statement in SQL stored procedure:

CREATE PROCEDURE test
as
SELECT 1 as dataNumber

If I read this number with dataReader

Int16 dataNumber
dataNumber=rdr.GetInt16(0);

I get an error - invalid cast.
<snip>

If you're ever wondering what type a value has, get it as an Object and
print out the type of it:

System.Diagnostics.Debug.WriteLine(rdr.GetValue(0).GetType().FullName);

Since GetValue will return DBNull.Value instead of null, doing this
should be safe enough, otherwise you'll need to check for a null result
if you're concerned about that.

Of course, by looking at it through the debugger you can do it much
easier without having to write extra code.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top