2011-01-20 2 views
0

Я застрял в данный момент с проблемой ниже. Я попытаюсь объяснить это как можно лучше, но дайте мне знать, если вам нужно больше разъяснений. Я поместил некоторые вещи в электронную таблицу google, чтобы помочь с объяснением, ссылка ниже.Вставка набора данных в DataTable

https://spreadsheets.google.com/ccc?key=0An70K3Q_IiWAdGpfV2YzNFQ4aTYxTWIxSUd5azVMWEE&hl=en&authkey=CMO898QP

таблицы:
MainTable = С # Применение DataTable
данных = SQL Результаты в SQL-запрос (Dataset)

Электронная таблица данных должна быть переведена/преобразованы в формат, указанный в MainTable.

Каждый rowid существует, потому что они относятся к чему-то уникальному. Так, например. Если мы предположим, что rowid 1 для «Total sales for this month», вы можете увидеть в таблице данных, что ячейка C2 должна перейти в ячейку E2 в электронной таблице MainTable.

Если мы предположим, что rowid 2 предназначен для «запаса на полке», вы можете увидеть в электронной таблице данных, что ячейке D3 необходимо перейти в ячейку F3 в электронной таблице MainTable.

... и прочее. Сначала я обратился к нему с приведенным ниже кодом, но это не сработает, потому что prodcode не уникален в моем наборе данных. Я бы создал другой набор данных или список, но тогда я не уверен, куда идти оттуда. Я смотрю на это неправильно?

foreach (DataRow dsrow in dsproduct.Tables["loadUniqueProducts"].Rows) 
     { 
      string prodcode = Convert.ToString(dsrow["prodcode"]); 

      for (int i = 1; i <= 14; i++) 
      { 
       row = table.NewRow(); 
       row["rowid"] = i; 
       row["prodcode"] = prodcode; 
       table.Rows.Add(row); 
      } 
     } 

Спасибо за помощь.

ответ

0

Весьма запутанный вопрос; DataSets, DataTables и электронные таблицы - это разные вещи. Есть loadUniqueProducts стол Data из вашей таблицы? Это DataTable, а не DataSet.

Таблицы упорядочены и имеют пустые строки и больше похожи на массив C#, чем DataTable; Таблицы данных не должны содержать пустые строки.

rowid - очень плохое имя для DataColumn, оно обычно используется для обозначения последовательного идентификатора строки из базы данных. prodcode не описывается нигде, это число после ваших данных «ПРОДУКТ»?

Почему вы добавляете 14 пустых строк? Вы должны добавлять только строки, содержащие данные в DataTable. Затем вы делаете это снова для каждой строки в loadUniqueProducts. Массовое дублирование данных.

Я предполагаю, что вы хотите сделать шаг по каждой строке в loadUniqueProducts и найти подходящую строку в MainTable. Если эта строка еще не существует, создайте ее. Затем выясните, какой столбец MainTable для «uniqueProducts» имеет значения и скопируйте их. Правильно ли это звучит?

Вот пример кода, который делает это для Total Sales (RowID = 1). Я не сделал этого для запаса на полках или любых других столбцах, но это должно дать вам идею:

foreach (DataRow r in dsproduct.Tables["loadUniqueProducts"].Rows) 
{ 
    int productID = r.Field<System.Int32>("ProductID"); 
    string productExpression = "ProductID=" + productID.ToString(); 
    string salesExpression = productExpression + " AND RowID=1"; 

    int? monthSales = r.Field<System.Int32?>("MonthSales"); 
    if ((monthSales.HasValue) && (monthSales.Value > 0)) 
    { 
     DataTable destTable= dsproduct.Tables["MainTable"]; 
     DataRow[] selectedRows = destTable.Select(salesExpression); 
     DataRow destRow; 
     if (selectedRows.Length > 1) 
      throw new Exception(String.Format("MainTable has ProductID {0} duplicate Sales RowID 1.", productID)); 
     else if (selectedRows.Length == 1) 
      destRow = selectedRows[0]; 
     else 
     { 
      destRow = destTable.NewRow(); 
      destRow.SetField<System.Int32>("RowID", 1); 
      destRow.SetField<System.Int32>("ProductID", productID); 
      destTable.Rows.Add(destRow); 
     } 

     string locColumn = "Loc" + r.Field<System.Char>("Loc"); 
     destRow.SetField<System.Int32>(locColumn, monthSales.Value); 
    } 

Это должно быть фиксированной, чтобы избежать создания имен столбцов во время выполнения и создание сильно названных DataTables бы получить избавьтесь от вещей <System.Int32>, но это должно вас начать.