没办法,出100分征求答案:ExecuteScalar得到的object,等于0时无法强制转成int

doocoo 2006-09-11 08:49:34
数据库内容:
id name
0 wawa

OledbDataCommand dbComm=new OleDbDataCommand("select max(id) from tb_temp",myConn);
MessageBox.Show(dbComm.ExecuteScalar().GetType().ToString());
显示:System.Int16

然后:
OledbDataCommand dbComm=new OleDbDataCommand("select max(id) from tb_temp",myConn);
MessageBox.Show(dbComm.ExecuteScalar().ToString());
显示:0

然后:
OledbDataCommand dbComm=new OleDbDataCommand("select max(id) from tb_temp",myConn);
int maxid=(int)dbComm.ExecuteScalar();//在这里报错:指定的转换无效,使用long maxid=(long)dbComm.ExecuteScalar();也不行
MessageBox.Show(maxid.ToString());

后又测试:
int i=0;
object objI=(object)0;
MessageBox.Show((int)objI);
又通过了


为什么?百思不解
...全文
576 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
laidon 2006-09-11
  • 打赏
  • 举报
回复
呵呵
在泛型里就是defult
zhiming99 2006-09-11
  • 打赏
  • 举报
回复
刚看过MSDN,那个0不是值,是未初始化,可也用DBNULL.Value 来比较,我的问题和你一样。
李必胜 2006-09-11
  • 打赏
  • 举报
回复
可能当max(id)小于等于0时,ExecuteScalar返回的是一个decimal 或者 double类型的值。
你直接在sql文中把max(id)转化为int,试试。
  • 打赏
  • 举报
回复
ToString 的结果是零意味着它转换为字符串显示为零,怎么能理解成值为零呢?
  • 打赏
  • 举报
回复
你数据库中id到底是什么类型?
新鲜鱼排 2006-09-11
  • 打赏
  • 举报
回复
语句只有 select max(id) from tb_temp 这一句么??
是否有类型转换的问题。
遇到过一次类似的问题是类型转换过程中长度的问题。
http://blog.csdn.net/dutguoyi/archive/2006/08/26/1122916.aspx
jijl2001 2006-09-11
  • 打赏
  • 举报
回复
()强制转换运算符

特点:
1,类型转换失败会抛出异常InvalidCastException
2,只要类型转换成立,null值不会抛出异常

Convert类转换

特点:
1,null值不会抛出异常,比如Convert.ToString(null)会返回String.Empty
2,由于格式不对,可能会抛出FormatException

as类型转换运算符

特点:
1,永远不会抛出异常
2,输入null值或者转换失败都会返回null


(typeName),此方法适合于类型,type.Parse, 此方法只适于类.NET中的数字类型,还有一种就是使用 Convert 类型来进行类型转换。

doocoo 2006-09-11
  • 打赏
  • 举报
回复
用Convert.ToInt32可以的,已经测试过了,问题是:为什么呢?
alex_zgx 2006-09-11
  • 打赏
  • 举报
回复
int maxid=int.Parse(dbComm.ExecuteScalar());

试一试看行不行
doocoo 2006-09-11
  • 打赏
  • 举报
回复
我想知道这是为什么?而且只有当max(id)小于等于0时才会发生错误,id>0的时候是可以通过的,为什么呢?
ohappy 2006-09-11
  • 打赏
  • 举报
回复
要想看差异,可以在两种情况下,设置对象,然后监视
int maxid=(int)dbComm.ExecuteScalar();//在这里报错:指定的转换无效,使用long maxid=(long)dbComm.ExecuteScalar();也不行
MessageBox.Show(maxid.ToString());

后又测试:
int i=0;
object objI=(object)0;
MessageBox.Show((int)objI);
这两种情况下的不同,就可以看出差异
ohappy 2006-09-11
  • 打赏
  • 举报
回复
int maxid=(int)dbComm.ExecuteScalar();改为
int maxid=Convert.toInt32(dbComm.ExecuteScalar())应该可以过去
Jianyi 2006-09-11
  • 打赏
  • 举报
回复
int maxid= Convert.ToInt32( dbComm.ExecuteScalar() );

--------
System.Int16 ?
System.Int32 ?
avisnet 2006-09-11
  • 打赏
  • 举报
回复
Int32.Parse

Convert.ToInt32

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧