异常详细信息: System.InvalidCastException: 指定的转换无效。

ermaogege 2010-01-29 09:31:08
源代码
private static IList<Restaurant> GetRestaurantsBySql( string safeSql )
{
List<Restaurant> list = new List<Restaurant>();

try
{
DataTable table = DBHelper.GetDataSet( safeSql );

foreach (DataRow row in table.Rows)
{
Restaurant restaurant = new Restaurant();

restaurant.Id = (int)row["Id"];
restaurant.ReName = (string)row["ReName"];
restaurant.RePhone = (string)row["RePhone"];
restaurant.ReFree = (int)row["ReFree"];
restaurant.OnTime = (string)row["OnTime"];
restaurant.ReAddress = (string)row["ReAddress"];
restaurant.ReParking = (int)row["ReParking"];
restaurant.ReUsing = (string)row["ReUsing"];
restaurant.ReSeries = (string)row["ReSeries"];
restaurant.ReLine = (string)row["ReLine"];
restaurant.Description = (string)row["Description"];
restaurant.ReMap = (string)row["ReMap"];
restaurant.Clicks = (int)row["Clicks"];
restaurant.Pic = (string)row["Pic"];
restaurant.ReType = ReTypeService.GetReTypeById((int)row["ReTypeId"]); //FK
restaurant.District = ReDistrictService.GetReDistrictById((int)row["DistrictId"]); //FK
restaurant.User = UserService.GetUserById((int)row["UserId"]); //FK

list.Add(restaurant);
}

return list;
}
catch (Exception e)
{
Console.WriteLine(e.Message);
throw e;
}

}
报错

指定的转换无效。
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。

异常详细信息: System.InvalidCastException: 指定的转换无效。

源错误:


行 245: {
行 246: Console.WriteLine(e.Message);
行 247: throw e;
行 248: }
行 249:


源文件: D:\DinnerPlat\DinnerPlatDAL\RestaurantService.cs 行: 247

堆栈跟踪:


[InvalidCastException: 指定的转换无效。]
DinnerPlat.DAL.RestaurantService.GetRestaurantsBySql(String safeSql) in D:\DinnerPlat\DinnerPlatDAL\RestaurantService.cs:247
DinnerPlat.DAL.RestaurantService.GetAllRestaurants() in D:\DinnerPlat\DinnerPlatDAL\RestaurantService.cs:144
DinnerPlat.BLL.RestaurantManager.GetAllRestaurants() in D:\DinnerPlat\DinnerPlatBLL\RestaurantManager.cs:41

[TargetInvocationException: 调用的目标发生了异常。]
System.RuntimeMethodHandle._InvokeMethodFast(Object target, Object[] arguments, SignatureStruct& sig, MethodAttributes methodAttributes, RuntimeTypeHandle typeOwner) +0
System.RuntimeMethodHandle.InvokeMethodFast(Object target, Object[] arguments, Signature sig, MethodAttributes methodAttributes, RuntimeTypeHandle typeOwner) +72
System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks) +296
System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) +29
System.Web.UI.WebControls.ObjectDataSourceView.InvokeMethod(ObjectDataSourceMethod method, Boolean disposeInstance, Object& instance) +484
System.Web.UI.WebControls.ObjectDataSourceView.ExecuteSelect(DataSourceSelectArguments arguments) +1869
System.Web.UI.DataSourceView.Select(DataSourceSelectArguments arguments, DataSourceViewSelectCallback callback) +13
System.Web.UI.WebControls.DataBoundControl.PerformSelect() +140
System.Web.UI.WebControls.BaseDataBoundControl.DataBind() +68
System.Web.UI.WebControls.GridView.DataBind() +5
System.Web.UI.WebControls.BaseDataBoundControl.EnsureDataBound() +61
System.Web.UI.WebControls.CompositeDataBoundControl.CreateChildControls() +67
System.Web.UI.Control.EnsureChildControls() +97
System.Web.UI.Control.PreRenderRecursiveInternal() +50
System.Web.UI.Control.PreRenderRecursiveInternal() +171
System.Web.UI.Control.PreRenderRecursiveInternal() +171
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +5729

用CodeSmith生成的,其他表都没问题,就是这个表老是出现这样的问题


...全文
3279 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
StillMiss 2010-10-23
  • 打赏
  • 举报
回复
学习 我也遇到这问题了 。
ermaogege 2010-01-29
  • 打赏
  • 举报
回复
我知道了,在数据库里把所有的数据类型设置一个默认值,然后把字符串的全部用.ToString()就没事了
ermaogege 2010-01-29
  • 打赏
  • 举报
回复
我现在的意思是如果是字符型的后面该怎么判断
xray2005 2010-01-29
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 ermaogege 的回复:]
按照6楼的说法改后
restaurant.OnTime = (string)row["OnTime"];又出现错误
那该怎么办

[/Quote]

看清楚哦。

6楼,那里给你贴出来的那段代码,全部要改。

不是只改一个哦。那一个只是举个例子。
ermaogege 2010-01-29
  • 打赏
  • 举报
回复
按照6楼的说法改后
restaurant.OnTime = (string)row["OnTime"];又出现错误
那该怎么办
xray2005 2010-01-29
  • 打赏
  • 举报
回复
看了我之前的回答吗?

[Quote=引用 8 楼 ermaogege 的回复:]
restaurant.ReFree = (int)row["ReFree"];这里出错了
可是数据库里,ReFree就是Int类型
[/Quote]


关键是:row["字段名"] 这样出来的是Object 类型(这个时候和你数据库是类型没关系),如果是数据库里面没有值,那么row["字段名"]就是一个null,

然后你把null转成对应的类型(如:int,string等),是无法转换的。当然就报转换失败了。


zhulong1111 2010-01-29
  • 打赏
  • 举报
回复
row[“字段名”]是 NULL,那么你这些强制转换的代码会出问题。NULL是无法转换到你指定的类型的。
所以,你转换前应该判断以下,比如:
restaurant.ReFree = row["ReFree"]==null?0:(int)row["ReFree"];


lz请注意 在null的时候是不能转换的 还有你转换为int的时候也容易出错 把调试重点放在null 和int转换上
ermaogege 2010-01-29
  • 打赏
  • 举报
回复

restaurant.ReFree = (int)row["ReFree"];这里出错了
可是数据库里,ReFree就是Int类型
vyxiang 2010-01-29
  • 打赏
  • 举报
回复
up
xray2005 2010-01-29
  • 打赏
  • 举报
回复
你的代码有问题。下面这些:
restaurant.Id = (int)row["Id"];
restaurant.ReName = (string)row["ReName"];
restaurant.RePhone = (string)row["RePhone"];
restaurant.ReFree = (int)row["ReFree"];
restaurant.OnTime = (string)row["OnTime"];
restaurant.ReAddress = (string)row["ReAddress"];
restaurant.ReParking = (int)row["ReParking"];
restaurant.ReUsing = (string)row["ReUsing"];
restaurant.ReSeries = (string)row["ReSeries"];
restaurant.ReLine = (string)row["ReLine"];
restaurant.Description = (string)row["Description"];
restaurant.ReMap = (string)row["ReMap"];
restaurant.Clicks = (int)row["Clicks"];
restaurant.Pic = (string)row["Pic"];
---------------------------------------------
row[“字段名”]是 NULL,那么你这些强制转换的代码会出问题。NULL是无法转换到你指定的类型的。
所以,你转换前应该判断以下,比如:
restaurant.ReFree = row["ReFree"]==null?0:(int)row["ReFree"];

其他的也是类似的改改。应该就对了。





tzs2304 2010-01-29
  • 打赏
  • 举报
回复
断点走下 看具体走到哪转换错了
happyboyxq 2010-01-29
  • 打赏
  • 举报
回复
foreach部分加个断点,看看什么地方转换有问题。
nanfei521 2010-01-29
  • 打赏
  • 举报
回复
把try异常捕获去掉,调试看一下具体是哪一个转换出的问题
nosuchtracter 2010-01-29
  • 打赏
  • 举报
回复
下面这段代码有问题,你先把部分注释掉,看还报错不,这样一个一个测试,就知道是哪个转换出错了。返回List不建议使用DataSet,使用DataReader吧
restaurant.Id = (int)row["Id"];
restaurant.ReName = (string)row["ReName"];
restaurant.RePhone = (string)row["RePhone"];
restaurant.ReFree = (int)row["ReFree"];
restaurant.OnTime = (string)row["OnTime"];
restaurant.ReAddress = (string)row["ReAddress"];
restaurant.ReParking = (int)row["ReParking"];
restaurant.ReUsing = (string)row["ReUsing"];
restaurant.ReSeries = (string)row["ReSeries"];
restaurant.ReLine = (string)row["ReLine"];
restaurant.Description = (string)row["Description"];
restaurant.ReMap = (string)row["ReMap"];
restaurant.Clicks = (int)row["Clicks"];
restaurant.Pic = (string)row["Pic"];
restaurant.ReType = ReTypeService.GetReTypeById((int)row["ReTypeId"]); //FK
restaurant.District = ReDistrictService.GetReDistrictById((int)row["DistrictId"]); //FK
restaurant.User = UserService.GetUserById((int)row["UserId"]); //FK
guyehanxinlei 2010-01-29
  • 打赏
  • 举报
回复
注意数据库表字段与C#数据类型的匹配
转化之前最好先TrayParse一下.

62,264

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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