0 голосов
спросил от в категории ASPNETVBNET
Привет,
перейдите по этой ссылке-
#c# - Split datatable into multiple fixed sized tables # [#^ #]

Пожалуйста, войдите или зарегистрируйтесь чтобы ответить на этот вопрос.

0 голосов
ответил от
Похоже, ваша логика неверна ... Взгляните на свой код, особенно на подчеркнутые части:
dtArr() = dt.Select("key_id <= 1 And key_id >= 30000").Clone() dtArr() = dt.Select("key_id <= 31000 And key_id >= 60000").Clone() dtArr() = dt.Select("key_id <= 61000 And key_id >= 90000").Clone() dtArr() = dt.Select("key_id <= 91000 And key_id >= 120000").Clone() dtArr() = dt.Select("key_id <= 121000 And key_id >= 150000").Clone()

< br> Вы смешивали меньше и больше, чем операторов! Другая проблема заключается в том, что вы теряете 1000 записей (31000-3000=1000) между каждым select !

Если вы хотите разделить данные на части с помощью 30000 записей, вы можете использовать Linq. Взгляните на пример ...

Метод # 1 - копирование данных с помощью key_id :



//source table DataTable src = new DataTable(); src.Columns.Add(new DataColumn("key_id", typeof(int))); //add example data src = Enumerable.Range(1,100).Select(x=>src.LoadDataRow(new object[]{x}, false)).CopyToDataTable(); int increasement = 30; int curVal = 1; //temporary object type of datarow DataRow[] result = null; //destination dataset, here we'll store smaller datatables DataSet ds = new DataSet(); do { result = src.AsEnumerable() .Where(x=>x.Field<int>("key_id")>=curVal && x.Field<int>("key_id")<curVal+increasement) .ToArray(); if(result.Length>0) { DataTable tmp = src.Clone(); tmp = result.CopyToDataTable(); ds.Tables.Add(tmp); } curVal+=increasement; } while(result.Length>0);

Dim src As DataTable = New DataTable() src.Columns.Add(New DataColumn("key_id", Type.GetType("System.Int32"))) 'add example data src = Enumerable.Range(1,100).Select(Function(x) src.LoadDataRow(New Object(){x}, False)).CopyToDataTable() Dim increasement As Integer = 30 Dim curVal As Integer = 1 Dim result As DataRow() Dim ds As DataSet = New DataSet() Do  result = src.AsEnumerable() _ .Where(Function(x) x.Field(Of Integer)("key_id")>=curVal And x.Field(Of Integer)("key_id")<curVal+increasement) _ .ToArray() If result.Length>0 Then Dim tmp As DataTable = src.Clone() tmp = result.CopyToDataTable() ds.Tables.Add(tmp) End If curVal+=increasement Loop While(result.Length>0)



br>

Метод № 2 - копирование того же числа строк:



int increasement = 30; int curVal = 0; //start with 0! DataRow[] result = null; DataSet ds = new DataSet(); do { result = src.AsEnumerable() .Skip(curVal) // .Take(increasement) .ToArray(); if(result.Length>0) { DataTable tmp = src.Clone(); tmp = result.CopyToDataTable(); ds.Tables.Add(tmp); } curVal+=increasement; } while(result.Length>0);


Dim increasement As Integer = 30 Dim curVal As Integer = 0 Dim result As DataRow()= Nothing Dim ds As DataSet = New DataSet() Do  result = src.AsEnumerable() _ .Skip(curVal) _ .Take(increasement) _ .ToArray() If result.Length>0 Then Dim tmp As DataTable = src.Clone() tmp = result.CopyToDataTable() ds.Tables.Add(tmp) End If curVal+=increasement Loop While(result.Length>0)




[EDIT ]
Решение не Linq - метод # 1:

'needed: 'Imports System.Data 'Imports System.Text Dim src As DataTable = New DataTable() src.Columns.Add(New DataColumn("key_id", Type.GetType("System.Int32"))) 'add example data For i As Integer = 0 To 100     src.Rows.Add(New Object() {i}) Next Dim increasement As Integer = 30 Dim curVal As Integer = 1 Dim result As DataRow() Dim ds As DataSet = New DataSet() Do     result = src.Select(String.Format("key_id >={0} And key_id<{1}", curVal, curVal + increasement)).Clone()     If result.Length > 0 Then         Dim tmp As DataTable = src.Clone()         Dim sb As StringBuilder = New StringBuilder()         For Each dr As DataRow In result             tmp.Rows.Add(New Object() {dr("key_id")})             sb.Append(String.Format("{0};", dr("key_id")))         Next         ds.Tables.Add(tmp)         Console.WriteLine("{0}", sb.ToString())         sb = Nothing     End If     curVal += increasement Loop While (result.Length > 0) Console.ReadKey() 

< br> Результат (4 таблицы):
1;2;3;

Категории

Добро пожаловать на сайт DraftingCode Q&A, где вы можете задавать вопросы и получать ответы от других членов сообщества.

Похожие вопросы

0 голосов
0 ответов
спросил 22 Авг, 18 от vincent maverick dur в категории ASPNETVBNET
0 голосов
0 ответов
0 голосов
0 ответов
спросил 12 Авг, 18 от member 13292615 в категории ASPNETVBNET
...