[已解决问题] 无法将类型为“System.Object”的对象强制转换为类
提问时间: 2008-07-10 21:49
悬赏分:30 浏览:384 次

我定义了一个如下的数据访问类的方法:

public object ExcuteScalar(string queryString)
        {
            OleDbCommand cd = new OleDbCommand();
            cd.CommandText = queryString;
            cd.CommandType = CommandType.Text;
            cd.Connection = Connection;
            object result=new object();
            try {
                result =cd.ExecuteScalar();               
                }
            catch {
              
            }
            return result;
        }

因为要取出数据库中的一个值,而且它是一个字符串类型,所以我用了以下语句:

string columnName =(string)db.ExcuteScalar(sqlString);

但是运行的时候,它引发了异常,无法将类型为“System.Object”的对象强制转换为类型“System.String”。

请问这是怎么回事,请大家帮忙看一下,谢谢!


问题补充:我已经调试过c#代码了,在ExcuteScalar()方法里设置了断点,调试时变量result的值为{object},所以转换为string类型就是System.Object了,这样的话是不是没取到数据呢?

最佳答案
告诉你一种通用的方法,就是调试,你可以在ExcuteScalar方法里面设置断点,然后监视cd.ExecuteScalar返回的类型,虽然他是object,但是你可以在监视中看到他的准确类型,这样你可以把这个object先转换成准确类型;然后再转换成你想要的类型。 还有一种简单的,但不一定高效的方法是使用Convert.ToString(Object obj)方法,这个方法不会抛出任何异常,通常都可以得到你想要的值。
2008/7/11 10:39:27 回答者:玉开


提问者对于答案的评价:因为没有从数据库中取到数据,所以它为object类型,所以就无法将object转换为string类型,谢谢!
其它回答(8)
ToString试试。
1个月前   回答者:Windie Chai(笑煞天) - 菜鸟二级
可能cd.ExecuteScalar()返回的是个int,或者别的什么东西,要把它转型成string,当然会抛异常了. 解决方法: result = cd.ExecuteScalar(); result = result != null ? result.ToString() : null;
1个月前   回答者:deerchao - 大侠五级
string columnName =(string)db.ExcuteScalar(sqlString); 当然不能这么强制转换了……基类到子类的强制转换,必然会报运行时错误。而先把一个子类赋值给基类,再进行基类到子类的强制转换,这就是允许的了。假设B是A的子类,即: B b = new B(); A a = b; B c = (B)a; 是允许的,而 A a = new A(); B b = (B)a; 是不允许的。
1个月前   回答者:麒麟.NET - 小虾三级
这个是我刚才写的这种转换是可以的: protected void Button1_Click(object sender, EventArgs e) { string strTemp = "morningwang"; Response.Write((string)GetValue(strTemp)); //显示结果是: Hello:morningwang } private object GetValue(string str) { object obj = new object(); obj = "Hello:" + str; return obj; } 你应该先判断db.ExcuteScalar(sqlString)是否为空,当不为空的时候在进行转行,你直接进行转换是比较危险的做法。
1个月前   回答者:金鱼 - 小虾三级
有可能返回的是个null,所有不能强制转换
1个月前   回答者:飄lá┽蕩去 - 初学一级
db.ExcuteScalar(sqlString) 返回的是Object型的,而Object型是没有办法强制转换成String型的,建议使用db.ExcuteScalar(sqlString).toString()
1个月前   回答者:吴畏 - 初学一级
Convert.ToString()
1个月前   回答者:Anders Cui - 小虾三级
建议楼主去了解下多态 其实类型的转换也就是设计里面的继承原则 而多态就是利用了继承原则的应用 例如一个int型的可以转换成object类型 因为object类型是int的父类 而string可以转换成object类型也是应为object是string的父类 而int型的即时转换成object了也不能转换成string 就如 苹果(string)和梨子(int)都是水果(object) 苹果可以用水果代言 伪代码: object shuiguo = string pingguo 正确 梨子也可以用水果来代言 伪代码: object shuiguo = int lizi 正确 但是我们不能叫苹果为梨子虽然说他们都是水果 伪代码: object shuiguo = int lizi 正确 string pingguo = object shuiguo 错误 本例中你返回的可能是个object型的int 是不能直接转换成string的
1个月前   回答者:小眼睛老鼠 - 小虾三级
评论
1个月前   爱上编程 :
谢谢各位的热心回答,麒麟.NET 和金鱼的解决方法都是讲同一个问题,我也是这样认为,要把基类转换为子类,必须先将子类对象赋给基类变量,但是我认为db.ExcuteScalar(sqlString)方法里应该完成了这个动作吧,因为数据库里的值是string类型,而返回的是object类型.应该先把它赋给object类型变量,再返回吧.

我改用"玉开"的做法,把(string)db.ExcuteScalar(sqlString)必成了Convert.ToString(db.ExcuteScalar(sqlString)),现在它不报错了,但是变量columnName得到的值为System.Object.然后我通过设置断点,调试T-SQL语句是对的啊,而且数据库里面也有数据不为空,怎么就取不到数据呢?
还有,我想知道(string)db.ExcuteScalar(sqlString)与Convert.ToString(db.ExcuteScalar(sqlString))有什么区别?
1个月前   玉开 :
如果你调试t-sql没有问题,那就调试c#代码,调试你写的ExcuteScalar方法,把断点设置到这个方法里面一步一步执行,监视cd.ExecuteScalar();返回值,看他的类型。
1个月前   吴畏 :
(string)db.ExcuteScalar(sqlString) 是强制转换
Convert.ToString(db.ExcuteScalar(sqlString))
传进去是Object型,应该直接返回,object.toString()

1个月前   爱上编程 :
我已经调试过c#代码了,在ExcuteScalar()方法里设置了断点,调试时变量result的值为{object},所以转换为string类型就是System.Object了,这样的话是不是没取到数据呢?

1个月前   麒麟.NET :
并不是没有取到数据,因为Object的ToString方法本身返回的就是System.Object,try一下:string s = ob as String
   您需要登录以后才能回答!
 

我要提问

我的问题


快到期问题

> 问题排行榜

相关链接