为什么linq 计数查询抛出一个异常,当我试图得到一个类型的计数

LINQ to SQL系列Part 5 - Binding UI using the ASP:LinqDataSource Control
&LINQ to SQL系列Part 5 - Binding UI using the ASP:LinqDataSource Control
本文转载自:
英文原贴链接:
在前几篇博文中,我重点讲的是怎么在编程时用LINQ to SQL来对数据库进行方便地查询和更新数据。今天的博文我将涉及到的是在.NET 3.5 release版中的作为asp.net的一部分的新增的&asp:LinqDataSource&控件。它是一个为ASP.NET 新增的数据源控件(像在ASP.NET 2.0中新增的ObjectDataSource和SQLDataSource一样),通过该控件你可以方便地将ASP.NET UI控件绑定到Linq To Sql 数据模型上。
我们要建立的事例程序:
在这篇教案中我用到的这个简单地能进行数据编辑的Web应用程序是为数据库是的products进行前-后的数据录入和操作。
图1&这个应用程序支持如下的终端用户特点:1.允许用户通过类别对产品进行筛选2.允许用户通过点击列头(Name,Price,Units In Stock等)对产品进行排序3.允许用户分布,在不同的页面之间进行跳转(每页显示10条产品记录)4.允许用户在页面上对在产品列表中列出来的产品详细信息进行编辑。5.允许用户从产品列表中删除产品记录。
这个Web应用程序用一个用LINQ To SQL ORM建立的面向对象的数据模型。(原文说clean object-oriented data model,这个clean该做何讲)
所有的业务规则和业务验证逻辑将会在我们在数据模型是验证,而不是在UI或者是在任何的UI页面上。这将能保证:1)一个可以在整个应用程序中应用的一致的规则2), 我们可以减少代码的书写,不重复地去写那些代码 3),以后我们可以便捷地修改或配置我们的业务逻辑,而不需要在我们整个应用程序中去修改数个地方。
我们也利用了LINQ To SQL的内置的分页/排序功能来保证产品列表的分页和排序不在中间层进行,而直接在数据库中查出我们需要的记录(也就是在给定的时间内只从数据库中查出10条记录--不会去查出上千条记录之后再在Web服务器上去完成分页/排序的功能)
什么是&asp:LinqDataSource&控件,它是怎么帮我们工作的?
&asp:LinqDataSource&控件是一个实现了在ASP.NET 2.0中介绍的DataSourceControl模式。它和ObjectDataSource和SqlDataSource控件很类似,可以显示将页面上的其他的ASP.NET 控件绑定到一个数据源。不同的是它不是直接绑定到数据库(像SQL DataSource)或者到一个类(像ObjectDataSource),它绑定的一个使用了LINQ的数据模型。
&使用&asp:LinqdataSource&的一个好处就是增加了基于ORMs支持的LINQ的灵活性。你可以不去定义自己的让数据源来调用的query/insert/update/delete方法,取而代之的是你将该控件指向你的数据模型,指明你想操作的哪张表,然后将任何的ASP.NET UI控件来绑定到它,然后让它们和&asp:LinqDataSource&一起进行工作。
&例如:为了从一个存在于LINQ to SQL 数据模型中的产品实体中找出一条基本的产品 数据来显示在页面上,我可以很简单地在页面上放置一个&asp:linqdatasource&,将它指定到我的LINQ To Sql datacontext类,然后指明我想绑定的实体(例如产品实体)。然后我可以将一个GridView指向它(设置一下GridView的DataSourceID)来获取一个产品的信息列表:
不用做其他的任何事情,我就可以运行此页,并在页面上显示一个支持分页和排序的数据列表。我也可以向GridView中增加修改/删除按钮,让它支持自动更新。我不需要添加任何的方法、视图、参数,或者为&asp:LinqDataSource&书写任何代码来支持这些查询和更新的事情,它可以自动地操作我们指定的Linq To SQL 数据模型。当进行更新时,LINQ To SQL ORM将在对数据库进行任何的操作之前,自动来验证我们写到LinqToSql数据模型中的业务逻辑的规则和验证逻辑是否正确。
重要:LINQ 和LINQ To SQL的美是它明显地不是仅仅能用来绑定UI控件,或者特定的像LinqDataSource这样的绑定控件。在我这个系列的博客中你已经了解,写LINQ to SQL ORM写代码是非常的简洁。如果你乐意,你可以直接写代码来控制你的UI,让UI上的控件来对你的Linq To Sql数据模型进行操作,或者当你发现某个UI场景不适合用&asp:linqdatasource&使用时,你也可以直接书写代码。
&下面的部分讲述了用&asp:LinqDataSource&来构建我上述定义的一个Web应用程序。
步骤1:定义数据模型
我们首先要定义用来描述我们的数据库的数据模型。 在该系列的Part 2 中我讲解了如何在VS2008的Linq To SQl设计器中生成一个LINQ to SQL数据模型。下面是一个我可以用LINQ to SQL设计器可以很快设计出来的一个&Northwind&数据库的模型:
我们会在第5步的时候再来看这个数据模型,届时我们将会向该模型中添加一些业务验证规则。开始时我们只是用它来建立我们的UI。
步骤 2: 建立基础的产品列表
我们用&asp:gridview&控件来开始整个页面的设计,向girdview中添加一些样式:
我们可以通过编码的方式来绑定我们原来定义的数据模型(像我在该系列的Part 3中做的那样),或者使用&asp:linqdatasource& 这个新增控件来将我们的数据模型绑定到gridview中。
VS2008内置了一个使得将LinqData绑定到gridview(或其他的asp.net 服务器控件)更加方便的设计器。我们可以切换到&设计&视图,选定gridview,然后选择&New Data Source&选择,然后选择其中的Choose Data Source项,通过以上几步,将LinqDataSource绑定到gridview上。
点击了&&New data source&后会弹出一个对话框,该对话框列表了所有你可以生成的可用的数据源选项。选择&Linq&选项来生成&asp:Linqdatasource&控件,并且对它进行命名:
&&asp:linqdatasource&设计器将将会列出应用程序中可用的 LINQ to SQL DataContext 类 (包括你引用的那些类字典):
我们选择刚才用LINQ to SQL设计器生成的数据模型。 然后选择我们存在于数据模型中的某数据表来&asp:linqdatasource&中绑定使用的的表。此处我们选择我们建立的&Product&实体。然后点击&Advanced&按钮来为数据源启用更新和删除::
当点击&Finish&按钮时,VS2008将会在我们的.aspx页面上生成一个&asp:linqdatasource&, 并且将gridview指向它(通过gridview的DataSourceID属性),它也根据我们选择绑定到的Product实体来在gridview上自动生成列。
然后在gridview中将&smart task&菜单展开,指定启用分页、启用排序、启用删除:
然后按下F5键来运行该程序,页面上就会显示出一个支持分页和排序的产品列表(每页的索引在grid的下边):
我们也可以点击在每行上的&edi&或&delete&按钮来更新数据:
如果我们切换到页面上的源视图,我们就会看到页面上显示的如下图的数据内容。&asp:linqdatasource&控件指向刚才创建的LINQ to SQL DataContext,同时也指向了我们想绑定到的表& GridView通过DataSourceID这个属性指向了&asp:linqdatasource&,并且设置了哪一列应该显示在表格中,每个列的列头应该是什么,在单击列头时的排序表达式。
现在我们已经有了基于LINQ to SQL数据模型的基础页面, 接着往下走,更深一步地设置UI和行为:
步骤 3: 删除某些我们不用的列
上面的gridview已经定义了许多的列, 而且其中两个列值 (SupplierID 和CategoryID) 是外键&如果将它们显示给用户当然会是一个非常理想的途径。
移除不需要的列
从删除一些我们不需要的列开始整理我们的UI.& 我可以在源模式中删除,(只需要删除某些&asp:boundfield&声明即可) 或者在设计模式 (在设计视图中单击列选择&Remove&即可。). 比如,我们可以移除&QuantityPerUnit& 列,然后重新运行程序,就得到了一些清洁一些的UI:
如果你用过&asp:ObjectDataSource& 控件,而且声明了更新的参数和更新的方法 (是使用基于TableAdapters的DataSet是默认的),其中一点比较痛苦的是在你页面上的参数被更改时,你必须更改你的TableAdapter的updatemethods的方法签名,例如::如果我们在gridview中删除了某一列(就像上边那样),我们就必须修改TableAdapter来让它支持除去那个参数之后的Update Methods.
&asp:LinqDataSource& 的其中一个真正比较好的东西是你不需要做一些如上所述的更改。在界面上简单地删除或添加某列,然后重新运行――不需要做任何的其他改变。这让使用&asp:LinqDataSource& 来创建的界面修改起来更加简单,使得应用程序中更改变得更加快速高效。
清除SupplierID 和CategoryID 列
当前在GridView中每个产品记录上都显示了两个外键的integer值:&&
从数据模型的观点来看,它对用户并不是十分友好。我真正想显示给用户的是CategoryName和 SupplierName,而并非两个数字,并且当用户选择&编辑&按钮时,显示给用户一个和SupplierID和CategoryID相关联的dropdownlist。
我可以按照如下方式更改:将GridView中的默认的&asp:BoundField&替换为 &asp:TemplateField&.& 在TemplateField我可以添加自定义的一些内容。
在如下的源码中我想用到的一个优点是,在每个LINQ To SQL数据模型中的Product类中,每条记录都有Supplier 和Category的属性.这就是说,我可以方便地将它们在gridview中绑定到panyName 和 Category.CategoryName 的子属性上:
现在运行程序,得到了人性化的Category和Supplier:
为了向页面中加上在GridView的编辑模式下可用的DropDownList, 首先需要在页面上加两个&asp:LinqDataSource& 控件.& 将它们分别配置为绑定到刚才创建的LINQ to SQL 数据模型的Categories 和 Suppliers上:
然后回到添加到GridView上的&asp:TemplateField&,然后自定义它们在编辑模式下的显示方式(通过设置EditItemTemplate)。我们定义每个列在编辑模式下显示一个dropdownlist控件, 在DropDownList中的可用的值是从刚才的categories和suppliers数据源控件中取来的,用两个各方式将selected value 绑定到Product's SupplierID 和 CategoryID foreign keys:
现在,当用户点击&Edi&按钮时,它就会一个关联到产品的合法的Suppliers下拉列表框,如下图:&&
当点击&Save&,该产品记录将会被更新。(GridView 会用当前DropDownList's 的当前的 selectedvalue来绑定SupplierID).
步骤 4: 根据某些条件查询产品列表
不仅仅是显示所有在数据库中的产品列表,我们还可以将界面修改为一个可以通过产品类型的下拉列表来查询产品的界面。
因为刚才我们已经添加了和我们的LINQ TO SQL数据模型相关联的的&asp:LinqDataSource& 控件,所以我此处需要做的只是在页面首部添加一个绑定到这个控件的drop-downlist 控件。比如:
运行此页面,现在在页面上方有一个可以过滤各个类别的产品的dropdownlist :
最后一步是将GridView设置为只显示用户从DropDownList中选择的类别的产品。最简便的方法是在GridView上通过选择&Configure DataSource&来设置此功能:
这就要回到在本节开始时我们提到的&asp:LinqDataSource&控件设计阶段了。我可以选择在其中&Where&按钮来添加一个绑定的过滤条件到这个数据源控件。我可以添加任意个过滤表达式,并且显示的从多处将值和过滤条件结合起来(比如: 从查询语句, 从值, 从页面上的其他控件等):
上边我想通过它们的CategoryID 的值来选择产品,该CategoryID从刚才在页面上创建的DropDownList 控件中检索该而得:
点击&finish&按钮,在页面上的 &asp:linqdatasource& 控件将会被更新为含有你下边这个的过滤条件:
现在,运行这个页面,用户就可以选择在DropDownList的里的那一类型的产品,并对其进行分页、排序、编辑、删除的操作。
&asp:LinqDataSource& 控件将自动从数据库中检索出基于LINQ to SQL 数据模型的过滤条件 ,并会自动进行查询优化(比如:在上边Grid中,只有第2页的3条记录从数据库中检索了出来)。
如果你想写自定义的查询条件的话,你可以处理&asp:LinqDataSource& 的Selecting事件。
步骤 5:添加业务验证规则
在该系列的 Part 4中我已经讲了,当 定义LINQ to SQL 数据模型时,将会有自动地有一个基于验证关系添加到我们的的数据模型中。这意味着,若试图将一个null值插入到一个不允许为null的列中,试图将一个string变量插入到一个interger类型的列,或者指定一个外键不存在的记录,LINQ to SQL数据模型将会抛出一个错误,保证我我们的数据实体被维护。
然后,基本的模式验证仅仅是第一步,并且在许多真实的程序中是远远不够的。一般来讲,我们想,而且应该向数据模型类中添加上额外的业务验证规则和应用程序级别的验证。感谢LINQ to SQL 将添加这些业务规则做得很方便 (更详细的各种各样的验证规则请阅读本系统列的Part 4).
一个业务验证规则的例子:
例如,让我们假定一个我们规定的基本的业务逻辑规则。具体来说, 我们保证当用户订购的产品数量大于我们库存的数量时,应该无法继续进行订货:
如果用户保存了上边的行,我们想阻止此类的更改,并且抛出一个恰当的错误来告诉用户该怎么解决它。
添加数据模型验证规则
在我们应用程序的UI层来添加这类验证规则是错误的!添加到UI层的就意思着这个规则只在该处适用,当在我们的应用程序中添加其他的也需要更新产品的页时它不会自动被触发。& UI层的分布式的业务规则/逻辑将会将随着程序的不断发展,在整个应用程序的各个代码中到处来修改这个规则将是一个非常痛苦的事情。
正确的添加数据模型验证规则的地方是在我们刚才已定义的LINQ to DATA 数据模型中。在本系统列的Part 4中我已经谈到,所有的用LINQ to SQL模型设计器生成的类都被定义为了&partial&――也就是说我们可以方便地向其中添加附加的方法/事件/属性。LINQ to SQL 数据模型类会自动地调用我们添加的增加增强了验证逻辑的验证方法。
例如,我可以向项目中添加一个局部类(partial Product),该类中声明LINQ to SQL的方法在更新Product实体之后先调用的OnValidate()的局部方法。在OnValidate()方法中,我可以添加如下的业务逻辑来增强以上提到的验证规则:
一旦我在LINQ to SQL工程中添加了以上的那个类,上边的业务逻辑验证规则将会在任何使用该数据模型的人试图更新数据库时触发。这对于更新已有的产品和添加新产品都是同样地会生效。
因为刚才我们在页面上定义的&asp:LinqDataSource& 控件是据我们的这个LINQ to SQL数据模型类的,它的所有update/insert/delete逻辑现在都会先经过以上的验证。我们不必在UI层做任何事情来保证这个验证来触发――它会在使用此数据模型的的任何及任意的地方被触发。
在UI层添加优秀的错误处理
默认地,现在用户用我们现在的这个GridView来输入一个非法的UnitsOnOrder/Discontinued combination,我们的LINQ to SQL 数据模型将会抛出一个异常。&asp:LinqDataSource& 将会捕获此异常,并且提供一个用户可以处理此异常的事件。如果在Global.asax文件中没有Application_Error()事件的话,那么绑定到&asp:LinqDataSource&GridView(或其他的控件)将会将错误传送到页面上,交给页面来处理,开发者可以选择在任何的地方来恰当地处理这个错误,从而提供给用户一个正确地用户体验。
对于我们刚才定义的应用程序而言,可能最好的处理处理异常的地方就是在GridView的 RowUpdated事件上。 这个事件将会在我们试图更新数据源的时候被触发,并且在更新事件失败时我们可以接收到此异常的信息。我们可以添加如下的代码来判断是否抛出了异常,是否给终端用户显示错误信息:
注意上边我们没有将验证具体逻辑加到UI上,取而代之的是,我检索在业务逻辑验证时设置的验证失败的错误信息字符串,并用该字符串来显示给终端用户一个恰当的信息(我将显示更多各类失败时的错误信息)。
注意我是如何做到当抛出错误信息时我是怎么让GridView保持在编辑状态的――那样的话用户就可以避免丢失他们的数据,而且可以修改他们录入的值再次点击&Update&按钮来保存数据。我们可以在页面的在显示错误信息的任何地方添加一个ID为ErrorMessage &asp:literal& 控件:
此时,当用非法的数据更新数据时,我们就会看到这条指明了我们该如何处理的错误信息:
现在的好处是,我现在可以在不修改任何UI层的代码的情况下来添加或者修改我的数据模型的业务规则,验证规则和相应的错误信息,可以在我的数据模型中写在一个地方,并且在异常抛出时自动地被触发。
&asp:LinqDataSource&控件提供了一种将ASP.NET UI 控件绑定到LINQ to SQL 数据模型的简单方法。它允许UI控件从一个LINQ to SQL 数据模型中检索数据,也允许高效地更新/插入/删除。&&
在以上的应用程序中,我们用LINQ to SQL ORM 设计器设计出了一个干净的,面向对象的数据模型。 然后我们向页面中添加了三个ASP.NET UI 控 (一个 GridView, 一个DropDownList, 一个 ErrorMessage Literal), 还添加了三个&asp:LinqDataSource& 控件来绑定数据模型中的 Product, Category, and Supplier
然后我们写了5行业务验证逻辑代码,11行UI错误处理逻辑。
这个简单的处理程序的结构实现了用户可以通过所属类别来检索数据,对产品列表高效排序和分类,在GridView内部来进行编辑/更新产品(还提供了我们的业务验证规则),从系统中删除产品记录(也提供了我们的业务验证规则)。
在下篇博文中,我将讲LINQ to SQL 对于并发冲突,lazy and eager加载,table mapping 的继承和自定义的sql server的存储过程的使用。
下周我还想开始一个新的博客系列:&asp:ListView&控件,它也是在.NET 3.5中新增的一个控件。它提供的是对数据的全部控制(没有tables,没有spans,没有inline styles..),而且还支持分布,排序,修改和插入。& 比如,我们选择用它来的自定义的显示模式来替换我们的Grid的默认的显示格式。最好的是,我可以无需修改我的数据模型而在页面中将grid来替换。
看过本文的人也看了:
我要留言技术领域:
取消收藏确定要取消收藏吗?
删除图谱提示你保存在该图谱下的知识内容也会被删除,建议你先将内容移到其他图谱中。你确定要删除知识图谱及其内容吗?
删除节点提示无法删除该知识节点,因该节点下仍保存有相关知识内容!
删除节点提示你确定要删除该知识节点吗?2208人阅读
总思想:不让两个链接(connection)同时发生。尽量使用一个EDMX(在一个EDMX中创建另一个的视图),如果不可以,需要分别进行查询不能放在一个语句中
1./Joetao/articles/2106426.html
class Program
static void Main(string[] args)
using(UserDBEntities context=new UserDBEntities() )
using (WaterManageEntities client = new WaterManageEntities())
int ID=client.Layers.FirstOrDefault().LayerID ;
var query = from s in context.NewsTypes where s.ID ==ID
foreach (NewsType type in query)
Console.WriteLine(type.NAME);
Console.ReadKey();
2./questions/7332920/the-specified-linq-expression-contains-references-to-queries-that-are-associated
var query = (from a in db1.Table1
join b in db1.Table2 on a.Id equals b.Id
orderby a.Status
where b.Id == 1 && a.Status == &new&
select new
Id = a.Id,
CompanyId = (from c pany
where s.Id == a.Id
new { c.CompanyId })
db1 and db2 are instances to two different edmx files.
(from a in db1.Table1
join b in db1.Table2 on a.Id equals b.Id
orderby a.Status
where b.Id == 1 && a.Status == &new&
select new a.Id).ToArray();
var query = from c pany
join a in IDs on c.Id equals a.Id
select new { Id = a.Id, CompanyId = c.CompanyId };
The .ToArray() is crucial. It prevents EF from trying to execute the combined query (which will fail since it uses two different contexts). You can use.AsEnumerable() if you'd rather keep lazy loading.
EDIT: In order for your original query to successfully run, it must use only a single data context, which means all the data must be available from a single EDMX, which in turn means a single connection string. There are several ways you
can achieve that:
If both tables are on the same database, add them both to a single EDMX.If they're on different databases but on the same instance, create a view on one of the databases that selects from the table on the other database, then add the local table and view to a single EDMX.If they're on different instances/servers, created a linked server, then create a view of the table on the linked server, then add the local table and view to a single EDMX.
.ToArray()是至关重要的。它阻止EF试图执行联合查询(这将会失败,因为它使用了两个不同的上下文中)。您可以使用.AsEnumerable()如果你宁愿保持延迟加载。
编辑:为了您的原始查询成功运行,它必须只使用单个数据上下文中,这意味着所有可用的数据必须从单一EDMX,反过来意味着一个连接字符串。有几种方法可以实现:
如果两个表是相同的数据库,将它们添加到一个EDMX。
如果他们不同的数据库,而是同一实例,创建一个视图的一个数据库,从表中选择其他数据库,然后添加单个EDMX当地表和视图。
如果他们在不同的实例/服务器上,创建了一个链接服务器,然后创建一个链接的服务器上的表视图,然后添加单个EDMX当地表和视图。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:649046次
积分:8841
积分:8841
排名:第1888名
原创:216篇
转载:344篇
评论:41条
(6)(6)(8)(7)(2)(7)(3)(1)(2)(8)(3)(10)(3)(2)(1)(29)(22)(4)(8)(16)(7)(4)(2)(1)(18)(45)(1)(18)(13)(14)(15)(12)(9)(10)(9)(15)(16)(4)(12)(14)(28)(18)(14)(9)(7)(5)(7)(7)(37)(3)(11)(1)(4)(18)(8)LINQ到CSV库_Libraries_平台,框架和库_或代码
| 文章 >> 平台,框架和库 >> Libraries
LINQ到CSV库
{A}目录{A7}{A8}{A9}{A10}{A11}{A12}{A13}{A14}简介这个库使得它易于使用CSV文件使用LINQ查询。它的功能包括:如下{A15}。正确处理数据字段包含逗号和换行符。除了逗号,可用于大多数分隔字符,包括制表符分隔字段标签。可以使用一个匿名类IEnumarable - 这通常是由一个LINQ查询返回。支持递延阅读。支持国际日期和数字格式处理文件。如果你需要他们支持不同的字符编码​​。读取文件时,确认的日期和数字格式的多种。写入文件时提供的日期和数字格式的精细控制。强健的错误处理,让您快速查找和修复大的输入文件中的问题。{A16}的要求要编译库,你需要一个C#2008编译器,如Visual Studio 2008或Visual C#2008 Express版。要运行库代码,你需要安装的。NET 3.5框架。{A17}安装这些说明适用于下载源和示例代码。 NuGet包自行安装。下载源代码的zip文件,解压缩到一个目录。在Visual Studio中打开代码\ LINQtoCSV.sln文件。你会发现来源解决方案中的这些内容,组织的:项目LINQtoCSV是实际库。项目的SampleCode本文中的示例代码。项目TestConsoleApplication是一个工作的控制台应用程序,练习库的大多数功能。该代码是严重的记载。内TestConsoleApplication项目的目录TestFiles,包含测试文件 - CSV和制表符分隔,并与美国和国际(荷兰)的日期和数字。编译解决方案。在代码\ LINQtoCSV \ bin目录,这将产生一个LINQtoCSV.dll文件。你需要该文件,用在自己的项目库。快速启动{A18}从文件读取在你的项目中,添加LINQtoCSV.dll您在产生的参考。该文件将被读入一个IE TGT;,其中T是您定义的数据类。从文件中读取数据记录将被保存在这个数据类的对象。沿着这些路线,您可以定义一个数据类:using LINQtoCSV;
class Product
[CsvColumn(Name = "ProductName", FieldIndex = 1)]
public string Name { get; set; }
[CsvColumn(FieldIndex = 2, OutputFormat = "dd MMM HH:mm:ss")]
public DateTime LaunchDate { get; set; }
[CsvColumn(FieldIndex = 3, CanBeNull = false, OutputFormat = "C")]
public decimal Price { get; set; }
[CsvColumn(FieldIndex = 4)]
public string Country { get; set; }
[CsvColumn(FieldIndex = 5)]
public string Description { get; set; }
}有了这个定义,你可以读入一个IE P虽然这个例子中只使用属性,图书馆的方法将识别以及简单的领域。只要确保你的字段/属性是公共。可选CsvColumn属性允许您指定一个字段/属性是否是必需的,它应该如何被写入到一个输出文件等的全部细节{A20}。导入源文件,在那里你可以阅读文件的顶部LINQtoCSV命名空间:{C}创建CsvFileDescription的对象,并初始化与有关文件的细节,你要读它。它看起来像这样:CsvFileDescription inputFileDescription = new CsvFileDescription
SeparatorChar = ',',
FirstLineHasColumnNames = true
};这允许您指定哪些字符是用来单独的数据字段(逗号,制表符,等),文件中的第一条记录是否持有列名,以及更多({A21})。创建一个CsvContext对象:CsvContext cc = new CsvContext();这是公开的Read和Write方法,您将使用读取和写入文件的对象。读入一个IEnumerablelt文件; TGT; CsvContext对象的Read方法,使用这样:IEnumerable&Product& products =
cc.Read&Product&("products.csv", inputFileDescription);这个文件读取到的变型产品,这类型IEnumerablelt products. P
现在,您可以访问通过LINQ查询中,foreach循环等的产品:
var productsByName =
from p in products
orderby p.Name
select new { p.Name, p.LaunchDate, p.Price, p.Description };
foreach (Product item in products) { .... }为了使更容易得到一个概述,这里的代码是从文件读取,但在一个现在去:CsvFileDescription inputFileDescription = new CsvFileDescription
SeparatorChar = ',',
FirstLineHasColumnNames = true
CsvContext cc = new CsvContext();
IEnumerable&Product& products =
cc.Read&Product&("products.csv", inputFileDescription);
var productsByName =
from p in products
orderby p.Name
select new { p.Name, p.LaunchDate, p.Price, p.Description };
foreach (Product item in products) { .... }你会觉得这是在{A22}中的SampleCode项目相同的代码写入文件这是非常相似{A23}。在你的项目中,添加LINQtoCSV.dll参考。Write方法需要一个IE TGT;写在IEnumerablelt每个类型T的对象; TGT;作为数据记录到文件。您的数据类的定义可能看起来像这样:using LINQtoCSV;
class Product
[CsvColumn(Name = "ProductName", FieldIndex = 1)]
public string Name { get; set; }
[CsvColumn(FieldIndex = 2, OutputFormat = "dd MMM HH:mm:ss")]
public DateTime LaunchDate { get; set; }
[CsvColumn(FieldIndex = 3, CanBeNull = false, OutputFormat = "C")]
public decimal Price { get; set; }
[CsvColumn(FieldIndex = 4)]
public string Country { get; set; }
[CsvColumn(FieldIndex = 5)]
public string Description { get; set; }
}可选属性允许您指定日期和数字格式写入每个数据字段时使用这样的事情。所有CsvColumn属性(CanBeNull,OutputFormat等)的详情,可{A20}。虽然这个例子中只使用属性,你也可以使用简单的领域。 Write方法会很乐意使用匿名类型为T,所以你可以写LINQ查询输出到一个文件的权利。在这种情况下,你显然不会自己定义T。 {A25},你会看到这样的一个例子。导入源文件,在那里你会被写入文件的顶部LINQtoCSV命名空间:{C}确保数据存储在一个对象,它实现IE TGT,如一个L TGT;或IE TGT; Read方法返回。List&Product& products2 = new List&Product&();
创建一个{A26}对象,和有关文件的细节,你会写沿着这些路线,对其进行初始化:CsvFileDescription outputFileDescription = new CsvFileDescription
SeparatorChar = '\t',
FirstLineHasColumnNames = false,
FileCultureName = "nl-NL" };创建一个CsvContext对象:CsvContext cc = new CsvContext();调用Write方法的CsvContext对象暴露您IEnu​​merablelt写的内容; TGT的文件:cc.Write(
products2,
"products2.csv",
outputFileDescription);这个可变产品2产品对象写入到文件 products2.下面是代码写入一个文件,但在一个现在去:List&Product& products2 = new List&Product&();
CsvFileDescription outputFileDescription = new CsvFileDescription
SeparatorChar = '\t',
FirstLineHasColumnNames = false,
FileCultureName = "nl-NL" };
CsvContext cc = new CsvContext();
products2,
"products2.csv",
outputFileDescription);{A27}如果你有一个LINQ查询产生一个匿名类型的IEnumerable,IEnumerable的文件是没有问题的书面:CsvFileDescription outputFileDescription = new CsvFileDescription
CsvContext cc = new CsvContext();
var productsNetherlands =
from p in products
where p.Country == "Netherlands"
select new { p.Name, p.LaunchDate, p.Price, p.Description };
productsNetherlands,
"products-Netherlands.csv",
outputFileDescription);在这里,LINQ查询选择所有产品 N从变型产品,并返回一个IEnumerable一些匿名类型的字段的名称,LaunchDate,价格,并介绍对象。 Write方法,然后将这些对象的文件产品Netherlands.csv。{A28} CsvContext.Write重载W TGT(IE TGT;值,字符串文件名);W TGT;(IE TGT;值,字符串文件名,CsvFileDescription fileDescription)W TGT(IE TGT,价值观,流的TextWriter);W TGT(IE TGT,价值观,流的TextWriter,CsvFileDescription fileDescription);有关这些重载的一些有趣的事实:没有重载返回值。Read方法不同,写不需要T有一个参数的构造函数。重载流写入数据流。那些需要一个文件名写入数据文件。不采取{A26}对象的重载简单地创建一个自己,使用默认值的CsvFileDescription属性。{A30} CsvContext.Read重载R TGT(字符串文件名);R TGT(字符串文件名,CsvFileDescription fileDescription);R TGT(StreamReader的流);R TGT(StreamReader的流,CsvFileDescription fileDescription);有关这些重载的一些有趣的事实:每个重载返回一个IE TGT;T必须有一个无参数的构造函数。如果你没有定义为T的构造函数,编译器会为你生成一个参数的构造函数。重载流从流中读取数据。那些需要一个文件名从文件中读取数据。然而,看到{A31}一节。不采取{A26}对象的重载简单地创建一个自己,使用默认值的CsvFileDescription属性。{A33}读原始数据行有时从CSV文件中的原始数据的领域,而不是让他们加工成对象库,更易于阅读。例如,如果可以有不同的行不同的格式,如果你在编译时不知道哪些领域是要持有什么样的数据。类型T实现接口IDataRow,您可以做到这一点。此接口包​​含在库中,所以你不必自己写的。它本质上只是介绍DataRowItem对象的集合:
public interface IDataRow
int Count { get; }
void Clear();
void Add(DataRowItem item);
DataRowItem this[int index] { get; set; }
DataRowItem类也定义在库中。它描述了一个数据行内的每个单独的领域:
public class DataRowItem
public int LineNbr
{ get { ... } }
public string Value { get { ... } }
行号是包含在DataRowItem类中,因为数据行可以跨越多行。
创建一个类实现IDataRow最简单的方法是从Listlt派生; DataRowI
using LINQtoCSV;
internal class MyDataRow : List&DataRowItem&, IDataRow
现在,您可以读入MyDataRow对象的集合的CSV文件:
IEnumerable&MyDataRow& products =
cc.Read&MyDataRow&("products.csv", inputFileDescription);
然后,您可以在每个数据行的每一个人的领域:
foreach (MyDataRow dataRow in products)
string firstFieldValue = dataRow[0].V
int firstFieldLineNbr = dataRow[0].LineN
string secondFieldValue = dataRow[1].V
int secondFieldLineNbr = dataRow[1].LineN
{A34}递延读
下面是如何读的重载实现递延阅读:当你调用Read方法(它返回一个IE TGT)时,还没有读取数据。如果使用的文件,该文件尚未打开。TGT;当枚举是从IEnumerablelt检索(例如,当启动一个foreach循环),打开文件进行阅读。如果使用流,流的是倒带(寻求开始流)。每次您检索到一个新的对象从统计员(例如,同时通过一个foreach循环),一个新的记录读取文件或流。当您关闭统计员(例如,一个foreach结束时,或当您跳出来),关闭该文件。如果使用流,流将保持不变。这意味着:如果从文件中读取,该文件将被打开阅读,当你访问IE TGT在foreach循环中。该文件可以更新之间的访问。您可以访问IE TGT;在foreach循环中,然后更新该文件,然后访问IE TGT在foreach循环中再次拿起新的数据,等你只需要调用一次在开始阅读,获得IE TGT;。CsvFileDescription {A35} Read和Write方法需要他们读或写,如第一条记录是否包含列名,有关文件的一些细节。 {A36}例子所示,你把这些细节的对象的类型CsvFileDescription,然后通过读或写方法。这可以防止冗长的参数列表,并允许您使用多个文件相同的细节。 CsvFileDescription对象具有以下属性:{A38}{A39}{A40}{A41}{A42}{A43}{A44}{A45}类型:字符默认值:','适用于:阅读和写作例如:CsvFileDescription fd = new CsvFileDescription();
fd.SeparatorChar = '\t';
CsvContext cc = new CsvContext();
cc.Write(data, "file.csv", fd);使用的字符不同领域中的文件。这将是一个逗号的CSV文件,或者说是"\ T"制表符分隔的文件。您可以使用您喜欢的任何字符,空白字符或双引号(")除外。{A46}类型:BOOL默认值:假适用于:只写例如:
假时,只写将数据字段周围的引号需要时,为避免混乱 - 例如,当该字段包含SeparatorChar或一个换行符。当为true时,写入所有数据字段用引号包围。
类型:BOOL默认值:真适用于:
阅读和写作例如:fd.FirstLineHasColumnNames = false; 阅读文件时,告诉阅读是否解释文件中的第一条记录的数据字段作为列标题。当写一个文件,告诉写是否写入文件的第一条记录的列标题。{A48} EnforceCsvColumnAttribute类型:BOOL默认值:假适用于:阅读和写作例如:fd.EnforceCsvColumnAttribute = true; 为真时,只读读入与[CsvColumn]属性的公共字段和属性数据字段,忽略所有其他字段和属性。只写写入与[CsvColumn]属性的公共字段和属性的内容。假时,所有公共字段和属性使用。{A49} FileCultureName类型:字符串默认值:当前的系统设置适用于:阅读和写作例如:fd.FileCultureName = "en-US"; 不同的文化用不同的方式来写日期和数字。 日是5/23/2008(EN - US)在美国和德国(DE - DE)23/5/2008。使用FileCultureName领域告诉阅读如何解释它从文件读取的日期和数字,并告诉写怎么写文件的日期和数字。默认情况下,图书馆的使用在你的系统当前设置语言/国家。因此,如果您的系统使用加拿大法语(FR - CA),图书馆使用,文化,除非你与FileCultureName覆盖。库​​使用相同的文化名NET。CultureI类({A50})。{A51} TextEncoding类型:默认值:Encoding.UTF8适用于:阅读和写作例如:fd.TextEncoding = Encoding.U 如果你读或写的文件是英文的,有没有必要设置TextEncoding。但是,如果你使用英语以外的语言,在文件中的字符编码​​方式可能是一个问题。你会想,以确保库所使用的编码与任何其他方案(编辑,电子表格),访问您的文件中所使用的编码。具体来说,如果你写的欧元符号的文件,您可能需要使用Unicode编码,如示例中所示。DetectEncodingFromByteOrderMarks {A53}类型:BOOL默认值:
适用于:只读例如:fd.DetectEncodingFromByteOrderMarks = false; 相关TextEncoding。默认情况下正常工作的罚款。告诉读取是否检测到的前三个字节的文件输入文件的编码。否则,它使用TextEncoding财产中的编码。{A54} MaximumNbrExceptions类型:INT默认值:100适用于:只读例如:fd.MaximumNbrExceptions = -1; 设置的最大数量将汇总到一个AggregatedException例外。没有任何限制,无论多少异常,设置AggregatedException为-1读取整个文件。汇总例外的详细信息,请参阅{A55}部分。CsvColumn属性{A56} {A36}例子所示,你可以装点您的数据类的公共字段和属性的CsvColumn属性指定的日期和编号字段的输出格式这样的事情。使用CsvColumn属性是可选的。只要{A40} {A26}对象的属性传递到读或写是假的,这些方法将在所有公共字段和数据类的属性。然后,他们将简单地使用每个CsvColumn属性下面显示的默认值。 CsvColumn属性,这些属性:{A59}{A60}{A61}{A62}{A63}{A64}
类型:字符串默认值:字段或属性名称适用于:阅读和写作例如:[CsvColumn(Name = "StartDate")]
public DateTime LaunchDate { get; set; } Read和Write方法通常假定在文件中的数据字段类中相应的字段或属性相同的名称。使用Name属性来指定另一个数据字段的名称。{A65}类型:BOOL默认值:真适用于:只读[CsvColumn(CanBeNull = false)]
public DateTime LaunchDate { get; set; }如果为false,并输入文件中的记录没有这一领域或财产的价值,那么Read方法生成一个{A66}例外。{A67}类型:BOOL默认值:Int32.MaxValue适用于:只读例如:[CsvColumn(FieldIndex = 1)]
public DateTime LaunchDate { get; set; }此属性是用于阅读和写作,但在略微不同的方式。读 - Read方法需要以某种方式关联领域和数据类的属性的输入文件中的数据字段。如果该文件已在第一条记录的列名,这很容易 - 读简单的数据类中的字段和属性的名称相匹配的列名。但是,如果该文件没有在第一条记录的列名,读取需要的数据记录的数据字段的顺序,数据类中的字段和属性,以配合他们。遗憾的是,。NET框架不提供一种方法来可靠地检索类定义的顺序。所以,你必须指定字段/属性来之前给CsvColumn与FieldIndex财产属性的字段和属性字段/属性。 FieldIndexs并没有从1开始。他们不必是连续的。 Read和Write方法将简单地假设一个字段/属性来之前的一些其他的字段/属性,如果其FieldIndex较低。写作 - Write方法使用FieldIndex每个字段或属性,以图以什么顺序写的数据字段的输出文件。没有FieldIndex场和性能得到书面的最后,以随机顺序。{A68} NumberStyle类型:{A69}默认值:NumberStyles.Any适用于:仅读数值字段例如:[CsvColumn(NumberStyle = NumberStyles.HexNumber)]
public DateTime LaunchDate { get; set; }允许您确定哪些数字样式的输入文件({A70})允许。默认情况下,所有的样式是允许的,除了一个特殊的情况下。为了接受不以0x开始,使用NumberStyles.HexNumber,如在本例中所示的十六进制数字。{A71} OutputFormat类型:字符串默认值:"G适用于:只写例如:[CsvColumn(OutputFormat = "dd MMM yy")]
public DateTime LaunchDate { get; set; }可让您设定的数字和日期/时间的输出格式。默认"; G格式行之有效的日期和数字的大部分时间。当写一个日期/时间或数字领域,Write方法首先确定字段类型(DATETIME,十进制,double等),然后调用该类型的ToString方法给予OutputFormat。因此,在上面的例子,如果LaunchDate是日,书面文件的领域将是"23 11月08。多种格式,最后的结果取决于文件的语言/国家,如{A41} {A26}对象的属性设置。所以,如果LaunchDate是日和您指定的短日期格式:[CsvColumn(OutputFormat = "d")]
public DateTime LaunchDate { get; set; }然后,最终值写入到输出文件将 11/23/08如果您使用美国日期(FileCultureName设置 EN - US),但 23/11/08如果你使用德国的日期(FileCultureName设置 - DEquot)。{A73}{A74}{A75}{A76}错误处理
{A77}LINQtoCSVException{A78}{A79}{A80}{A81}{A82}{A83}{A85}{A86}{A87}{A66}{A89}{A90} Read和Write方法检测到错误情况时,他们与所有你需要的信息来解决这个问题抛出一个异常。正如你所期望的的,所有的异常都来源于。NET类{A91}。检索错误信息除了堆栈跟踪和{A92}属性等特性。 Read和Write方法使用该属性来提供异常信息的方式,方便您的代码来读取,同时还提供针对人类通过Message属性的错误消息。为每个例外的说明(下文)显示哪些信息是存储在数据属性。 {A93}聚合例外 Read方法时检测到一个错误,而从文件中读取数据,它不会抛出异常了,但是存储在类型Listlt列表中; Exceptiongt。然后,经过处理的文件,它会抛出一个唯一的例外类型{A90},在它的数据"; InnerExceptionsL例外清单属性。这允许您修复一气呵成的输入文件中的所有问题,而不是一个接一个,。,您可以限制得到汇总{A44} {A26}对象传递给Read方法的属性设置这样的例外。默认情况下,MaximumNbrExceptions设置为100。当达到限制时,抛出的AggregatedException向右走,到目前为止汇总的例外列表。并非所有的异常,汇总!在阅读开始从文件中读取数据之前,它首先处理列名,CsvColumn属性等,如果出现错误,初步阶段,它抛出一个异常的时候了。递延阅读记住,由于{A31},你可以得到例外,不仅当你调用Read方法,而且当您访问的IE TGT; Read方法返回。示例下面的代码读取文件和处理异常。为了展示如何使用Data属性,它包含了一些特殊处理的DuplicateFieldIndexException - 抛出时,Read和Write方法检测两个领域或性质相同的{A63}。public static void ShowErrorMessage(string errorMessage)
public static void ReadFileWithExceptionHandling()
CsvContext cc = new CsvContext();
CsvFileDescription inputFileDescription = new CsvFileDescription
MaximumNbrExceptions = 50
IEnumerable&Product& products =
cc.Read&Product&("products.csv", inputFileDescription);
catch(AggregatedException ae)
List&Exception& innerExceptionsList =
(List&Exception&)ae.Data["InnerExceptionsList"];
foreach (Exception e in innerExceptionsList)
ShowErrorMessage(e.Message);
catch(DuplicateFieldIndexException dfie)
string typeName = Convert.ToString(dfie.Data["TypeName"]);
string fieldName = Convert.ToString(dfie.Data["FieldName"]);
string fieldName2 = Convert.ToString(dfie.Data["FieldName2"]);
int commonFieldIndex = Convert.ToInt32(dfie.Data["Index"]);
ShowErrorMessage(dfie.Message);
catch(Exception e)
ShowErrorMessage(e.Message);
}{A98}此异常公开为{A91}相同的属性。时抛出一个流是通过阅读,这是null,或不支持寻求。支持寻求流,否则它不能倒带时IEnumarable读访问返回。CsvColumnAttributeRequiredException {A100}此异常公开为{A91}相同的属性。时抛出CsvFileDescription对象已通过阅读有两个{A39}和{A40}设置为false。如果有在文件中没有列名,然后读取依赖于每个字段或属性的数据类文件中的数据字段,以配合他们的FieldIndex。但是,如果EnforceCsvColumnAttribute是假的,这意味着没有CsvColumn属性的字段或属性也可用于接受数据,而他们没有一个FieldIndex。DuplicateFieldIndexException {A103}附加属性 - 此异常公开为{A91}相同的属性,加上这些额外的属性:物业类型说明数据"; TypeN]字符串得罪的字段/属性的类的名称数据"; FieldN]字符串字段或属性具有重复FieldIndex数据"; FieldName2]数据"; I]INT常见FieldIndex时抛出两个或两个以上的字段或属性具有相同的{A63}。{A106} RequiredButMissingFieldIndexException附加属性 - 此异常公开为{A91}相同的属性,加上这些额外的属性:物业类型
说明数据"; TypeN]字符串得罪字段/属性的类的名称数据"; FieldN]字符串字段或属性没有FieldIndex的文件中的第一个记录({A39}是假),每一个需要的领域({A60}属性设置为false)没有列名必须有{A63}属性,否则它可以不被读取从该文件。ToBeWrittenButMissingFieldIndexException {A109}附加属性 - 此异常公开为{A91}相同的属性,加上这些额外的属性:物业类型说明数据"; TypeN]字符串得罪字段/属性的类的名称数据"; FieldN]字符串字段或属性没有FieldIndex当写在第一条记录没有列名的文件,你会希望确保出现在一个定义良好的顺序,在每一行的数据字段。如果这个顺序是随机的,它会被一些其他的计划,以可靠地处理文件是不可能的。因此,为假{A26} {A39} Write方法,并找到一个字段或属性,没有一个FieldIndex,它抛出一个ToBeWrittenButMissingFieldIndexException。NameNotInTypeException {A112}附加属性 - 此异常公开为{A91}相同的属性,加上这些额外的属性:
物业类型说明数据"; TypeN]字符串缺少字段/属性的类的名称数据"; FieldN]字符串没有找到的字段或属性数据"; FileN]字符串输入文件名称如果Read方法是一个{A26} {A39}为真,并在该文件中的第一条记录的列名不匹配字段或属性,它抛出一个NameNotInTypeException。MissingCsvColumnAttributeException {A115}附加属性 - 此异常公开为{A91}相同的属性,加上这些额外的属性:物业类型说明数据"; TypeN]字符串得罪字段/属性的类的名称
数据"; FieldN]字符串没有CsvColumn属性的字段或属性数据"; FileN]字符串输入文件名称
Read方法可能抛出此异常时,它被赋予一个{A26}既{A39}和{A40}为真。当是读取从第一条记录的列名,这些列名可能不有CsvColumn属性的字段或属性相匹配,即使只有一个CsvColumn属性的领域和属性可以使用。当这种情况发生,读抛出一个MissingCsvColumnAttributeException。TooManyDataFieldsException {A118}附加属性 - 此异常公开为{A91}相同的属性,加上这些额外的属性:物业类型说明数据"; TypeN]字符串数据类的名称数据"; LineN]INT多余的数据字段输入文件中的线数据"; FileN]字符串输入文件名称输入文件中的记录时有更多的数据字段,比有数据类的公共字段和属性引发的。TooManyNonCsvColumnDataFieldsException {A120}附加属性 - 此异常公开为{A91}相同的属性,加上这些额外的属性:物业类型说明数据"; TypeN]字符串数据类的名称数据"; LineN]INT多余的数据字段输入文件中的线数据"; FileN]字符串输入文件名称当有CsvColumn属性的唯一字段或属性(阅读{A26} {A40}为真),并输入文件中的记录更多的数据字段比有字段和属性CsvColumn属性,TooManyNonCsvColumnDataFieldsException被抛出。MissingFieldIndexException {的A123}附加属性 - 此异常公开为{A91}相同的属性,加上这些额外的属性:物业类型说明数据"; TypeN]字符串数据类的名称数据"; LineN]INT线得罪领域数据"; FileN]输入文件名称如果有输入文件的第一条记录中没有列名(阅读是一个{A26} {A39}为false),然后读取依赖于{A63}的数据类中的字段和属性文件中的数据字段,以配合他们。当输入文件中的记录更多的数据字段比有FieldIndex的数据类的字段和属性,然后抛出一个MissingFieldIndexException。MissingRequiredFieldException {A126}附加属性 - 此异常公开为{A91}相同的属性,加上这些额外的属性:物业类型说明数据"; TypeN]字符串所需的字段/属性的类的名称数据"; FieldN]字符串所需的字段/属性的名称数据"; LineN]已行缺少领域数据"; FileN]字符串输入文件名称从输入文件的记录不具有所需的字段或属性({A60}属性的属性设置为false)值时抛出。 NULL和空字符串之间的区别空字符串和字符串组成的只有空白需要用引号括起来,所以他们认可为null以外的东西。这些输入线都有的数据字段",空,和"abc,,def
,def虽然此行的数据字段,空字符串,由abc,"",def这行数据领域,由三个空格的字符串,由abc,"
",def{A129}附加属性 - 此异常公开为{A91}相同的属性,加上这些额外的属性:物业类型说明数据"; TypeN]字符串类的字段/属性的名称数据"; FieldN]字符串字段/属性的名称数据"; FieldV]字符串得罪的数据值数据"; LineN]INT得罪数据值线数据"; FileN]字符串输入文件名称一个字段格式错误时抛出。例如,一个数值字段值AggregatedException {A131}附加属性 - 此异常公开为{A91}相同的属性,加上这些额外的属性:物业类型说明数据"; TypeN]通过阅读使用的数据类的名称数据"; FileN]字符串输入文件名称数据"; InnerExceptionsL]L E例外情况一览表在读文件({A133}产生的总异常。{A134}历史版本发布说明1.011四月2008最初的版本。1.119 2011年S增加了阅读能力的原始数据行。
关于作者:
中国我是一名编程爱好者,谢谢为我们提供一个学习和分享的平台。有什么问题。可以就本内容回复,我看到时。会尽量回复的。
评论会员:
时间:作品魅力评论会员:
时间:它的工作完美评论会员:
时间:我有一些物业管理软件正在上传CSV文件。 说明字段中不包含任何HTML格式,但它确实有新行字符。
我看过你的代码,我看到有一个块,这是专门吃换行符{S0}
我建议增加一个新的配置项,在文件级别或在外地一级,让我绕过这个行为EatNewLineCharacters = FALSE 评论会员:
时间:!真棒评论会员:
时间:srosam:|有没有人用IDataErrorInfo这个?看来,当CsvContext试图连载或不管它不能处理"codeprespanclass="code-keyword"public/spanstringspanclass="code-keyword"this/span[stringcolumnName]/pre/code"。有什么建议?感谢。CynnerG评论会员:
时间:我承认在匆忙,并没有看过所有文件。有一个简单的方法,从网页导出到客户端系统我的文件(C#,asp.net)吗?尝试使用CSVContext.write,但没有结果。非常感谢这一点,GSutton萧保罗评论会员:
时间:codeprelang="c#"cc.Write(data,Response.Output,fd);/pre/code gloomygod评论会员:
时间:您好,当处理一个CSV文件中定义的类,将举行所有与CSV结构(如在快速入门指南)的详细信息,有反正这每个对象已读捕捉行号,或这样做的唯一途径切换到原始的读取模式?非常感谢很多马特Perdeck评论会员:
时间:喜郁,没有,只有这样,才能捕捉行号是在原始模式读取。马特三九咨询评论会员:
时间:,这是伟大的图书馆,我已经用它相当广泛不过,我现在在另一个项目中使用它,我对一个痛苦的错误来了steamreader实施。我的代码是这样的codeprelang="cs"spanclass="code-keyword"var/spaninputFileDescription=spanclass="code-keyword"new/spanCsvFileDescription{SeparatorChar=spanclass="code-string"'/spanspanclass="code-string";'/span,FirstLineHasColumnNames=spanclass="code-keyword"true/span};&spanclass="code-keyword"var/spancsv=spanclass="code-keyword"new/spanWebClient().DownloadData(spanclass="code-string""/spanspanclass="code-string"/csvfileroute"/span);spanclass="code-keyword"var/spanstream=spanclass="code-keyword"new/spanMemoryStream(csv);spanclass="code-keyword"var/spansr=spanclass="code-keyword"new/spanStreamReader(stream);spanclass="code-keyword"var/spancc=spanclass="code-keyword"new/spanCsvContext();spanclass="code-keyword"var/spanreader=cc.Read&Product&(sr,inputFileDescription);spanclass="code-keyword"var/spanrows=reader.ToList();&/pre/code这似乎并不工作,因为我得到一个异常:codepre{spanclass="code-string""/spanspanclass="code-string"Theinputfilehascolumnname\"ColumnName1;ColumnName2;ColumnName3\"."/span} LINQtoCSV.LINQtoCSVException{LINQtoCSV.NameNotInTypeException}/pre/code我已经检查所有列定义?当我下载的文件,并加载它使用codeprelang="xml"varinputFileDescription=newCsvFileDescription{SeparatorChar=';',FirstLineHasColumnNames=true};&varcc=newCsvContext();PixProProductList.Instance.Products=cc.Readspanclass="code-keyword"&/spanspanclass="code-leadattribute"PixProProduct/spanspanclass="code-keyword"&/span("filepath",inputFileDescription);/pre/code它的作品!它似乎被什么东西做的SteamReader,是有我丢失的东西在我的代码?亲切的问候,加里{A135} juntz评论会员:
时间:我有同样的问题,没有解决方案?juntz评论会员:
时间:解决方法:行:97文件:CsvFileDescription.cs更改属性:SeparatorChar=';';{BR}然后重建DLL费边德格鲁特评论会员:
时间:更改CsvContext.cs,在第59行:codeprespanclass="code-keyword"return/spanReadData&T&(null,stream,spanclass="code-keyword"new/spanCsvFileDescription());/pre/code:codeprespanclass="code-keyword"return/spanReadData&T&(null,stream,fileDescription);/pre/code lyp0722评论会员:
时间:错误消息:装配系统的版本,版本=2.0.0.0,文化=中性公钥=B77A5C不能加载此版本的MicrosoftNET精简框架。asdasdmierda评论会员:
时间:您好马特这里的一个问题。imgsrc=/upimg/_11_26_14_1.gif我有一个代码:codeprelang="c#"spanclass="code-keyword"var/spanretenciones=(fromespanclass="code-keyword"in/spanECEntities.Empresafromrspanclass="code-keyword"in/spane.Retencion_Ventafromuspanclass="code-keyword"in/spane.Usuariofromtrspanclass="code-keyword"in/spanECEntities.TipoComprobanteRetencionfromcspanclass="code-keyword"in/spanECEntities.Clientewhereu.userId==UserManager.userId&&r.isActivated==spanclass="code-keyword"true/span&&e.isActivated==spanclass="code-keyword"true/span&&tr.id==r.tipoRetencionId&&c.clienteId==r.clienteIdselectspanclass="code-keyword"new/span{r.fechaRetencion,c.razonSocial,c.numeroCuit,r.numeroComprobante,tipoRetencion=tr.descripcion,r.importe});&CsvFileDescriptionoutputFileDescription=spanclass="code-keyword"new/spanCsvFileDescription{SeparatorChar=spanclass="code-string"'/spanspanclass="code-string",'/span,FirstLineHasColumnNames=spanclass="code-keyword"true/span,FileCultureName=spanclass="code-string""/spanspanclass="code-string"es-AR"/span};&CsvContextcc=spanclass="code-keyword"new/spanCsvContext();spanclass="code-keyword"string/spanfinalPath=m_Config.csvPath+spanclass="code-string""/spanspanclass="code-string"retenciones_"/span+DateTime.Now.ToString(spanclass="code-string""/spanspanclass="code-string"yyyyMMddhhmmssfff"/span)+spanclass="code-string""/spanspanclass="code-string".csv"/cc.Write(retenciones,finalPath,outputFileDescription);/pre/code我怎样才能获得相同的顺序对匿名查询时,我救的。csv文件?目前,此代码工作正常,但列的顺序是随机的。感谢所有{S2}萨科马特Perdeck评论会员:
时间:喜萨科对不起,已经几年以来,我最后一次看着这个项目,所以我很生锈它{S3}我看起来像你写一个CSV文件。我想你所说的在新的CSV文件领域秩序。使用的FieldIndex属性是一个解决办法?马特 asdasdmierda评论会员:
时间:嘿马特感谢您的时间。在这个时刻我不#39;吨使用fieldindex财产,因为我不#39;吨有任何类。我只用写一个匿名查询的CSV有任何其他的方法,使您的图书馆?如果唯一的办法就是一类的情侣,以及...我会做{S4}的萨科 anderdw2评论会员:
时间:我得到以下错误,任何想法?我有以下的CSV:codeprelang="text""1/26/PM","test.eqa","","123456","0.98","3.063329","4.91","3.05519"/pre/code我读的代码是codeprelang="c#"spanclass="code-keyword"string/spanthisFile=Properties.Settings.Default.watcherPath.ToString()+e.Nspanclass="code-keyword"try/span{CsvFileDescriptioninputFileDescription=spanclass="code-keyword"new/spanCsvFileDescription{SeparatorChar=spanclass="code-string"'/spanspanclass="code-string",'/span,FirstLineHasColumnNames=spanclass="code-keyword"false/span,EnforceCsvColumnAttribute=spanclass="code-keyword"true/span,re};CsvContextcc=spanclass="code-keyword"new/spanCsvContext();spanclass="code-keyword"if/span(thisFile.Contains(spanclass="code-string""/spanspanclass="code-string"cornsilage"/span)){IEnumerable&CornSilagecornSil=cc.Read&CornSilage(thisFile,inputFileDescription);spanclass="code-keyword"foreach/span(spanclass="code-keyword"var/spanitemspanclass="code-keyword"in/spancornSil){spanclass="code-comment"///spanspanclass="code-comment"SaveUnityData("[UnityData].[dbo].[INSERT_CORNSILAGE]",addSqlParam());/span}}}/pre/code我的类是以下内容:我截断这个由于空间:codeprelang="cs"spanclass="code-keyword"public/spanspanclass="code-keyword"class/spanCornSilage{spanclass="code-keyword"private/spanSystem.DateTspanclass="code-keyword"private/spanspanclass="code-keyword"string/spanclass="code-keyword"private/spanspanclass="code-keyword"string/spanclass="code-keyword"private/spanspanclass="code-keyword"string/spanclass="code-keyword"private/spanspanclass="code-keyword"decimal/spanclass="code-keyword"private/spanspanclass="code-keyword"decimal/spanhygro_spanclass="code-keyword"private/spanspanclass="code-keyword"decimal/spanclass="code-keyword"private/spanspanclass="code-keyword"decimal/spancp_&spanclass="code-SummaryComment"////spanspanclass="code-comment"spanclass="code-SummaryComment"&/spanspanclass="code-SummaryComment"summary/spanspanclass="code-SummaryComment"//spanspanclass="code-SummaryComment"//spanspanclass="code-SummaryComment"//spanspanclass="code-SummaryComment"Get/spanspanclass="code-SummaryComment"the/spanspanclass="code-SummaryComment"data/spanspanclass="code-SummaryComment"returned/spanspanclass="code-SummaryComment"from/spanspanclass="code-SummaryComment"the/spanspanclass="code-SummaryComment"scanDate/spanspanclass="code-SummaryComment"column./spanspanclass="code-SummaryComment"//spanspanclass="code-SummaryComment"//spanspanclass="code-SummaryComment"//spanspanclass="code-SummaryComment"&/spanspanclass="code-SummaryComment"//spanspanclass="code-SummaryComment"summary[CsvColumn(Name/spanspanclass="code-SummaryComment"=/spanspanclass="code-SummaryComment""Equation",/spanspanclass="code-SummaryComment"FieldIndex/spanspanclass="code-SummaryComment"=/spanspanclass="code-SummaryComment"2)]/spanspanclass="code-SummaryComment"//spanspanclass="code-SummaryComment"//spanspanclass="code-SummaryComment"//spanspanclass="code-SummaryComment"[CsvColumn(Name=/spanspanclass="code-SummaryComment""ScanDate",/spanspanclass="code-SummaryComment"FieldIndex/spanspanclass="code-SummaryComment"=/spanspanclass="code-SummaryComment"1)]/spanspanclass="code-SummaryComment"public/spanspanclass="code-SummaryComment"System.DateTime/spanspanclass="code-SummaryComment"ScanDate/spanspanclass="code-SummaryComment"{/spanspanclass="code-SummaryComment"get/spanspanclass="code-SummaryComment"{/spanspanclass="code-SummaryComment"return/spanspanclass="code-SummaryComment"this./spanspanclass="code-SummaryComment"}/spanspanclass="code-SummaryComment"set/spanspanclass="code-SummaryComment"{/spanspanclass="code-SummaryComment"this.scandate/spanspanclass="code-SummaryComment"=/spanspanclass="code-SummaryComment"/spanspanclass="code-SummaryComment"}/spanspanclass="code-SummaryComment"}/spanspanclass="code-SummaryComment"//spanspanclass="code-SummaryComment"//spanspanclass="code-SummaryComment"//spanspanclass="code-SummaryComment"&summary/spanspanclass="code-SummaryComment"//spanspanclass="code-SummaryComment"//spanspanclass="code-SummaryComment"//spanspanclass="code-SummaryComment"Get/spanspanclass="code-SummaryComment"the/spanspanclass="code-SummaryComment"data/spanspanclass="code-SummaryComment"returned/spanspanclass="code-SummaryComment"from/spanspanclass="code-SummaryComment"the/spanspanclass="code-SummaryComment"equation/spanspanclass="code-SummaryComment"column./spanspanclass="code-SummaryComment"//spanspanclass="code-SummaryComment"//spanspanclass="code-SummaryComment"//spanspanclass="code-SummaryComment"&/spanspanclass="code-SummaryComment"//spanspanclass="code-SummaryComment"summary[CsvColumn(Name/spanspanclass="code-SummaryComment"=/spanspanclass="code-SummaryComment""Equation",/spanspanclass="code-SummaryComment"FieldIndex/spanspanclass="code-SummaryComment"=/spanspanclass="code-SummaryComment"2)]/spanspanclass="code-SummaryComment"[CsvColumn(Name/spanspanclass="code-SummaryComment"=/spanspanclass="code-SummaryComment""Equation",/spanspanclass="code-SummaryComment"FieldIndex/spanspanclass="code-SummaryComment"=/spanspanclass="code-SummaryComment"2)]/spanspanclass="code-SummaryComment"public/spanspanclass="code-SummaryComment"string/spanspanclass="code-SummaryComment"Equation/spanspanclass="code-SummaryComment"{/spanspanclass="code-SummaryComment"get/spanspanclass="code-SummaryComment"{/spanspanclass="code-SummaryComment"return/spanspanclass="code-SummaryComment"this./spanspanclass="code-SummaryComment"}/spanspanclass="code-SummaryComment"set/spanspanclass="code-SummaryComment"{/spanspanclass="code-SummaryComment"this.equation/spanspanclass="code-SummaryComment"=/spanspanclass="code-SummaryComment"/spanspanclass="code-SummaryComment"}/spanspanclass="code-SummaryComment"}/spanspanclass="code-SummaryComment"//spanspanclass="code-SummaryComment"//spanspanclass="code-SummaryComment"//spanspanclass="code-SummaryComment"&summary/spanspanclass="code-SummaryComment"//spanspanclass="code-SummaryComment"//spanspanclass="code-SummaryComment"//spanspanclass="code-SummaryComment"Get/spanspanclass="code-SummaryComment"the/spanspanclass="code-SummaryComment"data/spanspanclass="code-SummaryComment"returned/spanspanclass="code-SummaryComment"from/spanspanclass="code-SummaryComment"the/spanspanclass="code-SummaryComment"batchSample/spanspanclass="code-SummaryComment"column./spanspanclass="code-SummaryComment"//spanspanclass="code-SummaryComment"//spanspanclass="code-SummaryComment"//spanspanclass="code-SummaryComment"&/spanspanclass="code-SummaryComment"//spanspanclass="code-SummaryComment"summary/spanspanclass="code-SummaryComment"[CsvColumn(Name/spanspanclass="code-SummaryComment"=/spanspanclass="code-SummaryComment""BatchSample",/spanspanclass="code-SummaryComment"FieldIndex/spanspanclass="code-SummaryComment"=/spanspanclass="code-SummaryComment"3)]/spanspanclass="code-SummaryComment"public/spanspanclass="code-SummaryComment"string/spanspanclass="code-SummaryComment"BatchSample/spanspanclass="code-SummaryComment"{/spanspanclass="code-SummaryComment"get/spanspanclass="code-SummaryComment"{/spanspanclass="code-SummaryComment"return/spanspanclass="code-SummaryComment"this./spanspanclass="code-SummaryComment"}/spanspanclass="code-SummaryComment"set/spanspanclass="code-SummaryComment"{/spanspanclass="code-SummaryComment"this.batchsample/spanspanclass="code-SummaryComment"=/spanspanclass="code-SummaryComment"/spanspanclass="code-SummaryComment"}/spanspanclass="code-SummaryComment"}/spanspanclass="code-SummaryComment"//spanspanclass="code-SummaryComment"//spanspanclass="code-SummaryComment"//spanspanclass="code-SummaryComment"&summary/spanspanclass="code-SummaryComment"//spanspanclass="code-SummaryComment"//spanspanclass="code-SummaryComment"//spanspanclass="code-SummaryComment"Get/spanspanclass="code-SummaryComment"the/spanspanclass="code-SummaryComment"data/spanspanclass="code-SummaryComment"returned/spanspanclass="code-SummaryComment"from/spanspanclass="code-SummaryComment"the/spanspanclass="code-SummaryComment"serialNumber/spanspanclass="code-SummaryComment"column./spanspanclass="code-SummaryComment"//spanspanclass="code-SummaryComment"//spanspanclass="code-SummaryComment"//spanspanclass="code-SummaryComment"&/spanspanclass="code-SummaryComment"//spanspanclass="code-SummaryComment"summary/spanspanclass="code-SummaryComment"[CsvColumn(Name/spanspanclass="code-SummaryComment"=/spanspanclass="code-SummaryComment""SerialNumber",/spanspanclass="code-SummaryComment"FieldIndex/spanspanclass="code-SummaryComment"=/spanspanclass="code-SummaryComment"4)]/spanspanclass="code-SummaryComment"public/spanspanclass="code-SummaryComment"string/spanspanclass="code-SummaryComment"SerialNumber/spanspanclass="code-SummaryComment"{/spanspanclass="code-SummaryComment"get/spanspanclass="code-SummaryComment"{/spanspanclass="code-SummaryComment"return/spanspanclass="code-SummaryComment"this./spanspanclass="code-SummaryComment"}/spanspanclass="code-SummaryComment"set/spanspanclass="code-SummaryComment"{/spanspanclass="code-SummaryComment"this.serialnumber/spanspanclass="code-SummaryComment"=/spanspanclass="code-SummaryComment"/spanspanclass="code-SummaryComment"}/spanspanclass="code-SummaryComment"}/spanspanclass="code-SummaryComment"//spanspanclass="code-SummaryComment"//spanspanclass="code-SummaryComment"//spanspanclass="code-SummaryComment"&summary/spanspanclass="code-SummaryComment"//spanspanclass="code-SummaryComment"//spanspanclass="code-SummaryComment"//spanspanclass="code-SummaryComment"Get/spanspanclass="code-SummaryComment"the/spanspanclass="code-SummaryComment"data/spanspanclass="code-SummaryComment"returned/spanspanclass="code-SummaryComment"from/spanspanclass="code-SummaryComment"the/spanspanclass="code-SummaryComment"HY/spanspanclass="code-SummaryComment"column./spanspanclass="code-SummaryComment"//spanspanclass="code-SummaryComment"//spanspanclass="code-SummaryComment"//spanspanclass="code-SummaryComment"&/spanspanclass="code-SummaryComment"//spanspanclass="code-SummaryComment"summary/spanspanclass="code-SummaryComment"[CsvColumn(Name/spanspanclass="code-SummaryComment"=/spanspanclass="code-SummaryComment""Hygro",/spanspanclass="code-SummaryComment"FieldIndex/spanspanclass="code-SummaryComment"=/spanspanclass="code-SummaryComment"5)]/spanspanclass="code-SummaryComment"public/spanspanclass="code-SummaryComment"decimal/spanspanclass="code-SummaryComment"HY/spanspanclass="code-SummaryComment"{/spanspanclass="code-SummaryComment"get/spanspanclass="code-SummaryComment"{/spanspanclass="code-SummaryComment"return/spanspanclass="code-SummaryComment"this./spanspanclass="code-SummaryComment"}/spanspanclass="code-SummaryComment"set/spanspanclass="code-SummaryComment"{/spanspanclass="code-SummaryComment"this.hygro/spanspanclass="code-SummaryComment"=/spanspanclass="code-SummaryComment"/spanspanclass="code-SummaryComment"}/spanspanclass="code-SummaryComment"}/spanspanclass="code-SummaryComment"//spanspanclass="code-SummaryComment"//spanspanclass="code-SummaryComment"//spanspanclass="code-SummaryComment"&summary/spanspanclass="code-SummaryComment"//spanspanclass="code-SummaryComment"//spanspanclass="code-SummaryComment"//spanspanclass="code-SummaryComment"Get/spanspanclass="code-SummaryComment"the/spanspanclass="code-SummaryComment"data/spanspanclass="code-SummaryComment"returned/spanspanclass="code-SummaryComment"from/spanspanclass="code-SummaryComment"the/spanspanclass="code-SummaryComment"HY_ND/spanspanclass="code-SummaryComment"column./spanspanclass="code-SummaryComment"//spanspanclass="code-SummaryComment"//spanspanclass="code-SummaryComment"//spanspanclass="code-SummaryComment"&/spanspanclass="code-SummaryComment"//spanspanclass="code-SummaryComment"summary/spanspanclass="code-SummaryComment"[CsvColumn(Name/spanspanclass="code-SummaryComment"=/spanspanclass="code-SummaryComment""HY_ND",/spanspanclass="code-SummaryComment"FieldIndex/spanspanclass="code-SummaryComment"=/spanspanclass="code-SummaryComment"6)]/spanspanclass="code-SummaryComment"public/spanspanclass="code-SummaryComment"decimal/spanspanclass="code-SummaryComment"HY_ND/spanspanclass="code-SummaryComment"{/spanspanclass="code-SummaryComment"get/spanspanclass="code-SummaryComment"{/spanspanclass="code-SummaryComment"return/spanspanclass="code-SummaryComment"this.hygro_/spanspanclass="code-SummaryComment"}/spanspanclass="code-SummaryComment"set/spanspanclass="code-SummaryComment"{/spanspanclass="code-SummaryComment"this.hygro_nd/spanspanclass="code-SummaryComment"=/spanspanclass="code-SummaryComment"/spanspanclass="code-SummaryComment"}/spanspanclass="code-SummaryComment"}/spanspanclass="code-SummaryComment"//spanspanclass="code-SummaryComment"//spanspanclass="code-SummaryComment"//spanspanclass="code-SummaryComment"&summary/spanspanclass="code-SummaryComment"//spanspanclass="code-SummaryComment"//spanspanclass="code-SummaryComment"//spanspanclass="code-SummaryComment"Get/spanspanclass="code-SummaryComment"the/spanspanclass="code-SummaryComment"data/spanspanclass="code-SummaryComment"returned/spanspanclass="code-SummaryComment"from/spanspanclass="code-SummaryComment"the/spanspanclass="code-SummaryComment"CP/spanspanclass="code-SummaryComment"column./spanspanclass="code-SummaryComment"//spanspanclass="code-SummaryComment"//spanspanclass="code-SummaryComment"//spanspanclass="code-SummaryComment"&/spanspanclass="code-SummaryComment"//spanspanclass="code-SummaryComment"summary/spanspanclass="code-SummaryComment"[CsvColumn(Name/spanspanclass="code-SummaryComment"=/spanspanclass="code-SummaryComment""CP",/spanspanclass="code-SummaryComment"FieldIndex/spanspanclass="code-SummaryComment"=/spanspanclass="code-SummaryComment"7)]/spanspanclass="code-SummaryComment"public/spanspanclass="code-SummaryComment"decimal/spanspanclass="code-SummaryComment"CP/spanspanclass="code-SummaryComment"{/spanspanclass="code-SummaryComment"get/spanspanclass="code-SummaryComment"{/spanspanclass="code-SummaryComment"return/spanspanclass="code-SummaryComment"this./spanspanclass="code-SummaryComment"}/spanspanclass="code-SummaryComment"set/spanspanclass="code-SummaryComment"{/spanspanclass="code-SummaryComment"this.cp/spanspanclass="code-SummaryComment"=/spanspanclass="code-SummaryComment"/spanspanclass="code-SummaryComment"}/spanspanclass="code-SummaryComment"}/spanspanclass="code-SummaryComment"//spanspanclass="code-SummaryComment"//spanspanclass="code-SummaryComment"//spanspanclass="code-SummaryComment"&summary/spanspanclass="code-SummaryComment"//spanspanclass="code-SummaryComment"//spanspanclass="code-SummaryComment"//spanspanclass="code-SummaryComment"Get/spanspanclass="code-SummaryComment"the/spanspanclass="code-SummaryComment"data/spanspanclass="code-SummaryComment"returned/spanspanclass="code-SummaryComment"from/spanspanclass="code-SummaryComment"the/spanspanclass="code-SummaryComment"CP_ND/spanspanclass="code-SummaryComment"column./spanspanclass="code-SummaryComment"//spanspanclass="code-SummaryComment"//spanspanclass="code-SummaryComment"//spanspanclass="code-SummaryComment"&/spanspanclass="code-SummaryComment"//spanspanclass="code-SummaryComment"summary/spanspanclass="code-SummaryComment"[CsvColumn(Name/spanspanclass="code-SummaryComment"=/spanspanclass="code-SummaryComment""CP_ND",/spanspanclass="code-SummaryComment"FieldIndex/spanspanclass="code-SummaryComment"=/spanspanclass="code-SummaryComment"8)]/spanspanclass="code-SummaryComment"public/spanspanclass="code-SummaryComment"decimal/spanspanclass="code-SummaryComment"CP_ND/spanspanclass="code-SummaryComment"{/spanspanclass="code-SummaryComment"get/spanspanclass="code-SummaryComment"{/spanspanclass="code-SummaryComment"return/spanspanclass="code-SummaryComment"this.cp_/spanspanclass="code-SummaryComment"}/spanspanclass="code-SummaryComment"set/spanspanclass="code-SummaryComment"{/spanspanclass="code-SummaryComment"this.cp_nd/spanspanclass="code-SummaryComment"=/spanspanclass="code-SummaryComment"/spanspanclass="code-SummaryComment"}/spanspanclass="code-SummaryComment"}/span&/span/pre/code修改上周日,8月7日,2011下午09:11乔治天鹅评论会员:
时间:我的理解是,字段名称需要公开,你需要使用适当的CsvColumn属性的属性,如果CSV文件的第一行不包含标题。所以,你的类定义将包含codeprelang="c#"[CsvColumn(FieldIndex=spanclass="code-digit"1/span)]spanclass="code-keyword"public/spanDateT......[CsvColumn(FieldIndex=spanclass="code-digit"5/span,NumberStyle=NumberStyles.AllowParentheses|NumberStyles.AllowDecimalPoint)]spanclass="code-keyword"public/spanspanclass="code-keyword"decimal/..../pre/code祝。miltonhowe评论会员:
时间:我有一个172列的csv文件,我只关心少数的,所以我创造我所需要的属性和装饰CsvColumn属性。但该方案给出了一个NameNotInTypeException-显然,我需要定义所有172属性!必须有一个更好的方法来做到这一点...... shenron评论会员:
时间:这实在是一个真棒我碰到的库。我用这个写一个CSV文件。一切的伟大工程。但是,当一个数字列的值太长,Excel会转换成一个指数格式(如2.38403E11)。如何可以关闭这个功能呢?,
&桌面&网页开发&移动开发&数据库&多媒体&编程语言&平台,框架和库&编程通用&图形/设计&开发周期&一般阅读&第三方产品&作者资源&其他
快速解答标签
价值作最多

我要回帖

更多关于 java 手动抛出异常 的文章

 

随机推荐