LINQ操作DataTable出现指定的转换无效问题的解决

开发 后端
本文将为大家介绍LINQ操作DataTable出现指定的转换无效错误的解决方法,希望对大家有所帮助。

51CTO开发频道向您推荐《LINQ教程-LINQ to SQL技术精解》,以便于您更好的理解这篇文章。

下面进入正题,说说我在开发过程遇到的问题 “LINQ操作DataTable的问题 ”。

在平时的工作中,可能有很多情况下要对DataTable的里面的数据进行处理,最简单的例子如:对DataTable中的某个字段进行排序,根据条件筛选DataTable中的数据。。。,例子很多,下面我们看看如何处理的:

这是我最初写的代码:

代码 

  1. public static IEnumerable getEnumerable()   
  2.  {  
  3.   DataTable dt = getDatatable();  
  4.   try 
  5.   {  
  6.    var query = from q in dt.AsEnumerable()  
  7.    where q.Field<string>("IPLocation") == "纯真网络 2008年6月20日IP数据" 
  8.    select new 
  9.    {  
  10.    IPid = q.Field<int>("IPid"),  
  11.    IPFrom = q.Field<string>("IPFrom"),  
  12.    IPTo = q.Field<string>("IPTo"),  
  13.    IPCity = q.Field<string>("IPCity"),  
  14.    IPToNumber = q.Field<string>("IPToNumber"),  
  15.    IPFromNumber = q.Field<string>("IPFromNumber")  
  16.    };  
  17.    return query;  
  18.    }  
  19.    catch 
  20.    {  
  21.  return null;  
  22.   }  
  23.  } 

然后我在***做数据源绑定的时候,总是报System.InvalidCastException: 指定的转换无效的错误,无论用Gridview的自动生成列,还是Reapter的手动添加列,都有问题,***我查出生成的结果集就含有异常的存在,也就说再取结果集的时候,要慎重用如下写法:

  1. IPid = q.Field<int>("IPid"),  
  2. IPFrom = q.Field<string>("IPFrom"),  
  3. IPTo = q.Field<string>("IPTo"),  
  4. IPCity = q.Field<string>("IPCity"),  
  5. IPToNumber = q.Field<string>("IPToNumber"),  
  6. IPFromNumber = q.Field<string>("IPFromNumber"

 我后来尝试了另一种写法:

  1. IPid = q["IPid"].ToString(),  
  2. IPFrom = q["IPFrom"].ToString(),  
  3. IPTo = q["IPTo"].ToString(),  
  4. IPLocation = q["IPLocation"].ToString(),  
  5. IPCity = q["IPCity"].ToString(),  
  6. IPToNumber = q["IPToNumber"].ToString(),  
  7. IPFromNumber = q["IPFromNumber"].ToString() 

一开始我调试也还是报System.InvalidCastException: 指定的转换无效这个错误,我调试了一段时间,也还是有问题,我在想是不是数据绑定控件的问题,后来我将原来的Gridview自动生成列换成了手动输入列:

代码 

  1. <table  align="center" width="100%" cellpadding="0" cellspacing="0" style="border: Gray 1px solid; margin-top:5px; margin-bottom:10px"> 
  2.    <asp:Repeater ID="rpTest" runat="server"> 
  3.    <HeaderTemplate> 
  4. <tr> 
  5.    <th style=" background-color:Gray; color:White;border: Gray 1px solid;text-align:center">ID</th> 
  6.    <th style=" background-color:Black; color:White;border: Gray 1px solid;text-align:center">IPFrom</th> 
  7.    <th style=" background-color:Black; color:White;border: Gray 1px solid;text-align:center">IPTo</th> 
  8.    <th style=" background-color:Black; color:White;border: Gray 1px solid;text-align:center">IPLocation</th> 
  9.    <th style=" background-color:Black; color:White;border: Gray 1px solid;text-align:center">City</th> 
  10.    <th style=" background-color:Black; color:White;border: Gray 1px solid;text-align:center">IPToNumber</th> 
  11.    <th style=" background-color:Black; color:White;border: Gray 1px solid;text-align:center">IPFromNumber</th> 
  12. </tr> 
  13.    </HeaderTemplate> 
  14.  <ItemTemplate> 
  15. <tr> 
  16.  <td style="border: Gray 1px solid;text-align:center;"><%#Eval("IPid")%></td> 
  17.  <td style="border: Gray 1px solid;text-align:center;"><%#Eval("IPFrom")%></td>   
  18.  <td style="border: Gray 1px solid;text-align:center;"><%#Eval("IPTo")%></td>   
  19.  <td style="border: Gray 1px solid;text-align:center;"><%#Eval("IPLocation")%></td> 
  20.  <td style="border: Gray 1px solid;text-align:center;"> 
  21. <%#Eval("IPCity") %> 
  22.  </td>    
  23.  <td style="border: Gray 1px solid;text-align:center;"><%#Eval("IPToNumber")%></td>    
  24.  <td style="border: Gray 1px solid;text-align:center;"><%#Eval("IPFromNumber")%></td> 
  25.    </tr> 
  26.  </ItemTemplate> 
  27.    </asp:Repeater> 
  28.  </table> 

后来问题就解决了,我现在也不知道这个问题什么原因,为什么不支持自动产生列呢(等待高手帮忙解决)?

知道问题的所在了,然后就可以随心的处理DataTable里面的数据了,如下面一个简单的小例子:

代码 

  1. public static IEnumerable getEnumerable()  
  2.    {  
  3.   DataTable dt = getDatatable();  
  4.   try 
  5.   {  
  6.  var query = from q in dt.AsEnumerable()  
  7.    orderby long.Parse(q["IPid"].ToString()) descending  
  8.    where q["IPid"].ToString() == "345058" 
  9.    select new 
  10.    {  
  11.   IPid = q["IPid"].ToString(),  
  12.   IPFrom = q["IPFrom"].ToString(),  
  13.   IPTo = q["IPTo"].ToString(),  
  14.   IPLocation = q["IPLocation"].ToString(),  
  15.   IPCity = q["IPCity"].ToString(),  
  16.   IPToNumber = q["IPToNumber"].ToString(),  
  17.   IPFromNumber = q["IPFromNumber"].ToString()  
  18.    };  
  19.  return query;  
  20.  //List<IPInfo> list = new List<IPInfo>();  
  21.  //foreach (var q in query)  
  22.  //{  
  23.  //IPInfo model = new IPInfo();  
  24.  //model.IPCity = q.IPCity;  
  25.  //model.IPFrom = q.IPFrom;  
  26.  //model.IPFromNumber = q.IPFromNumber;  
  27.  //model.IPid = long.Parse(q.IPid);  
  28.  //model.IPLocation = q.IPLocation;  
  29.  //model.IPTo = q.IPTo;  
  30.  //model.IPToNumber = q.IPToNumber;  
  31.  //list.Add(model);  
  32.  //}  
  33.  //return list;  
  34.   }  
  35.   catch 
  36.   {  
  37.  return null;  
  38.   }  
  39.    } 

当然更复杂的对DataTable的操作这里就不在敖述了,在这里我只是说明一下困扰我的问题。

原文标题:关于Linq操作DataTable的问题

链接:http://www.cnblogs.com/yangtongnet/archive/2010/05/10/1731728.html

【编辑推荐】

  1. Linq匿名类型简单概述
  2. Linq随机读取数据浅析
  3. Linq Lambda表达式全面分析
  4. Linq扩展方法简单分析
  5. 初探Linq局部变量类型

 

 

责任编辑:彭凡 来源: 博客园
相关推荐

2009-09-15 16:52:19

Linq To Dat

2009-09-10 09:35:25

Linq语句

2011-05-17 13:22:50

SQL对象名无效

2009-09-15 17:45:34

Linq多条件

2009-09-15 17:46:08

C#绑定句柄无效

2010-04-30 10:24:00

Oracle查询指定记

2009-09-14 10:29:02

LINQ删除记录

2009-06-12 12:37:38

Java软件

2010-06-12 12:46:04

Grub Rescue

2011-03-22 10:05:58

2010-05-11 13:25:18

Mysql大小写

2009-09-15 13:45:58

Linq To Sql

2009-09-08 16:55:01

Linq实现XML转换

2010-04-16 17:38:25

2009-09-16 16:59:05

LINQ to XML

2009-09-18 16:07:10

Linq Where操

2009-09-10 14:54:15

LINQ使用Skip操

2009-09-08 15:19:52

Linq Where操

2009-09-14 10:13:02

LINQ查询操作

2009-09-15 13:30:54

linq级联
点赞
收藏

51CTO技术栈公众号