如何使用C#拆分数据表? [英] How to split the data table using C#?
问题描述
我使用 ASEnumerable()
功能,但dataset.datatable是发生无效参数错误
。我包括 System.linq;
命名空间和 system.data.extensions.dll
以及我项目所需的dll但仍然显示此错误
i将尝试此代码
列表< datatable> result = DTHead.AsEnumerable()
.GroupBy(row = > row.Field< int>( MIVID))
。选择(g = > g.CopyToDataTable ())
.ToList();
嗯......你的代码看起来不错。我测试了上面的查询,它按预期工作。请参阅:
DataTable dt = new DataTable();
dt.Columns.Add( new DataColumn( ID, typeof ( int )));
dt.Columns.Add( new DataColumn( 注意, typeof ( string )));
dt.Rows.Add( new object [] { 1 , A});
dt.Rows.Add( new object [] { 1 , B});
dt.Rows.Add( new object [] { 1 , C});
dt.Rows.Add( new object [] { 2 , D});
dt.Rows.Add( new object [] { 2 , E});
dt.Rows.Add( new object [] { 2 , F});
dt.Rows.Add( new object [] { 3 , G});
dt.Rows.Add( new object [] { 3 , H});
dt.Rows.Add( new object [] { 3 , I});
dt.Rows.Add( new object [] { 4 , J});
dt.Rows.Add( new object [] { 4 , K});
dt.Rows.Add( new object [] { 4 , L});
// 1。方法
List< datatable> result = dt.AsEnumerable()
.GroupBy(x => x.Field< int>( ID))
。选择(grp => grp.CopyToDataTable())
.ToList();
/// / 2。方法
// var result = dt.AsEnumerable()
// 。GroupBy(x => x.Field< int>(ID))
// .ToList();
//
// 列表与LT;数据表> dts = new List< datatable>();
// foreach(结果中的var d )
// {
// dts.Add(d.CopyToDataTable());
/ / }< / datatable>< / datatable>< / int>< / int>< / datatable>
无效的文件
错误很容易解决。因此,您必须调试程序以找出错误发生的位置。
同时请阅读:无效的程序调用或参数(错误5) [ ^ ]
]
Raja Ganapathy写道:
[在评论中解决方案1]
i浏览你的代码sir.i有n个列我想从数据表中拆分前24列和行。怎么做。
如果你想只获得几列,请替换:
。选择(grp => grp.CopyToDataTable( ))
with
。选择(grp => grp.Select(a => new) {
Col1 = a.Field< Type>( Name1 ),
Col2 = a.Field< Type>( Name2 ),
...
ColN = a.Field< Type>( NameN)
})。CopyToDataTable())
[/ EDIT]
< blockquote>
// 这是数据表演示
DataTable tbl = new DataTable();
tbl.Columns.Add( Column);
for ( int i = 0 ; i < 61 ; i ++)
tbl.Rows.Add(i。的ToString());
DataTable [] splittedtables = tbl.AsEnumerable()
.Select((row,index)= > ; new {row,index})
.GroupBy(x = > x.index / 12 ) // 整数除法,小数部分被截断
。选择(g = > g。选择(x = > x.row).CopyToDataTable())
.ToArray();
参考此示例并将列拆分为数据集内的单独表。
DataTable dtMain = new DataTable();
for ( int i = 1 ; i < = 10 ; i ++)
dtMain.Columns.Add(< span class =code-string> col + i);
dtMain.Rows.Add( 1 );
string [] columnNames = dtMain.Columns.OfType< DataColumn>()。选择(k = > k.ColumnName)。ToArray();
列表< List< string>> lst = new 列表< List< string>>();
int splitby = 3 ;
int colCount = dtMain.Columns.Count;
int splitCount =(colCount / splitby)+((colCount%splitby)> < span class =code-digit> 0 ? 1 : 0 );
for ( int i = 0 ; i < splitCount; i ++)
lst.Add(columnNames.Skip(i * splitby).Take(splitby)。 ToList()); ;
DataSet dsFinal = new DataSet();
for ( int i = 0 ; i < lst.Count; i ++)
{
DataTable dtTemp = dtMain.Copy();
dtTemp.TableName = split + i.ToString();
columnNames.Except(lst [i])。ToList()。ForEach(col = > dtTemp.Columns.Remove(col));
dtTemp.AcceptChanges();
dsFinal.Tables.Add(dtTemp);
}
I use the ASEnumerable()
funtion, but dataset.datatable is invalid argument error occur
. i include System.linq;
namespace and system.data.extensions.dll
and the needed dll to my project but still show this error
i will try this code
List<datatable> result = DTHead.AsEnumerable()
.GroupBy(row => row.Field<int>("MIVID"))
.Select(g => g.CopyToDataTable())
.ToList();
Well... Your code looks good. I tested above query and it works as expected. See:
DataTable dt = new DataTable(); dt.Columns.Add(new DataColumn("ID", typeof(int))); dt.Columns.Add(new DataColumn("Note", typeof(string))); dt.Rows.Add(new object[]{1, "A"}); dt.Rows.Add(new object[]{1, "B"}); dt.Rows.Add(new object[]{1, "C"}); dt.Rows.Add(new object[]{2, "D"}); dt.Rows.Add(new object[]{2, "E"}); dt.Rows.Add(new object[]{2, "F"}); dt.Rows.Add(new object[]{3, "G"}); dt.Rows.Add(new object[]{3, "H"}); dt.Rows.Add(new object[]{3, "I"}); dt.Rows.Add(new object[]{4, "J"}); dt.Rows.Add(new object[]{4, "K"}); dt.Rows.Add(new object[]{4, "L"}); //1. method List<datatable> result = dt.AsEnumerable() .GroupBy(x=>x.Field<int>("ID")) .Select(grp=>grp.CopyToDataTable()) .ToList(); ////2. method //var result = dt.AsEnumerable() // .GroupBy(x=>x.Field<int>("ID")) // .ToList(); // //List<datatable> dts = new List<datatable>(); //foreach(var d in result) //{ // dts.Add(d.CopyToDataTable()); //}</datatable></datatable></int></int></datatable>
"Invalid agument
" error is easy to resolve. So, you have to debug your programme to find out where the error occur.
In the meanwhile, please read this: Invalid procedure call or argument (Error 5)[^]
[EDIT]
Raja Ganapathy wrote:
[in the comment to the solution1]
i go through your code sir.i have n numbers of columns i want to split first 24 columns and rows from the data table.How to do it.
If you want to get only few columns, replace:
.Select(grp=>grp.CopyToDataTable())
with
.Select(grp=>grp.Select(a=>new{ Col1 = a.Field<Type>("Name1"), Col2 = a.Field<Type>("Name2"), ... ColN = a.Field<Type>("NameN") }).CopyToDataTable())
[/EDIT]
//this is datatable demo DataTable tbl = new DataTable(); tbl.Columns.Add("Column"); for(int i=0; i < 61; i++) tbl.Rows.Add(i.ToString()); DataTable[] splittedtables = tbl.AsEnumerable() .Select((row, index) => new { row, index }) .GroupBy(x => x.index / 12) // integer division, the fractional part is truncated .Select(g => g.Select(x => x.row).CopyToDataTable()) .ToArray();
refer this example and split the columns to a separate tables inside dataset.
DataTable dtMain = new DataTable(); for (int i = 1; i <= 10; i++) dtMain.Columns.Add("col" + i); dtMain.Rows.Add(1); string[] columnNames = dtMain.Columns.OfType<DataColumn>().Select(k => k.ColumnName).ToArray(); List<List<string>> lst = new List<List<string>>(); int splitby = 3; int colCount = dtMain.Columns.Count; int splitCount = (colCount / splitby) + ((colCount % splitby) > 0 ? 1 : 0); for (int i = 0; i < splitCount; i++) lst.Add(columnNames.Skip(i * splitby).Take(splitby).ToList()); ; DataSet dsFinal = new DataSet(); for (int i = 0; i < lst.Count; i++) { DataTable dtTemp = dtMain.Copy(); dtTemp.TableName = "split" + i.ToString(); columnNames.Except(lst[i]).ToList().ForEach(col => dtTemp.Columns.Remove(col)); dtTemp.AcceptChanges(); dsFinal.Tables.Add(dtTemp); }
这篇关于如何使用C#拆分数据表?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!