С# DataTable Добавить столбец DuplicateNameException

Я пытаюсь добавить столбец в таблицу данных в наборе данных на С# (набор данных считывается из XML-документа). Кажется, что если я назову столбец, я получу исключение DuplicateNameException при попытке добавить его. Если я оставлю столбец безымянным, он будет добавлен в таблицу данных. Кажется, не имеет значения, каково имя столбца на самом деле; просто определено ли свойство Datatable.ColumnName.

Вот соответствующий блок кода (xR — это ранее определенный XmlTextReader, и все это в цикле while xR.Read()):

xR.ReadToDescendant(this.calDataTag);
XmlReader xS = xR.ReadSubtree();
ds.ReadXml(xS);

foreach (DataTable dt in ds.Tables)
{
   if (dt.Columns.Contains("offset"))
   {
      if (dt.TableName == "Single")
      {
         DataColumn c1 = new DataColumn();
         c1.Caption = "TipType";
         c1.ColumnName = "whatever";
         dt.Columns.Add(c1);
      }

      foreach (DataRow dr in dt.Rows)
      {
         foreach (DataColumn dc in dt.Columns)
         {
            outString.Add("Table: " + dt.TableName.ToString() + " Column: " + dc.ColumnName.ToString() + " RowVal: " + dr[dc] + " " + dt.Columns.Contains("whatever")); 
         }
      }
    }
 }

Интересно, что часть строки dt.Columns.Contains("whatever") всегда возвращает False. Так что это не настоящее исключение DuplicateNameException. Я уверен, что просто неправильно реализую метод Columns.Add. Любые советы приветствуются.


person JMarotta    schedule 11.04.2013    source источник
comment
Суть в том, что у вас не может быть 2 столбцов с одинаковым именем. Вы никогда не достигнете dt.Columns.Contains("whatever"), чтобы увидеть true, потому что ваш код ломается на dt.Columns.Add(c1);   -  person banging    schedule 12.04.2013
comment
Я не понял, но вы добавляете столбец «Что угодно» в таблицу, а затем в следующий раз, если оба условия в вашем первом foreach верны, вы снова добавляете «Что угодно» в таблицу.   -  person Kashif    schedule 12.04.2013
comment
@Kashif - очевидно, я пытаюсь добавить один и тот же столбец в одну и ту же таблицу несколько раз. Довольно ошибка новичка. Спасибо!   -  person JMarotta    schedule 12.04.2013


Ответы (1)


мне кажется, вы проверяете неправильные условия или, по крайней мере, недостаточно прикрываете себя, вместо того, чтобы делать это:

if (dt.Columns.Contains("offset"))
   {
      if (dt.TableName == "Single")

почему бы не сделать:

if (dt.TableName == "Single" && !dt.Columns.Contains("whatever") && dt.Columns.Contains("offset"))
{
  var c1 = new DataColumn();
  c1.Caption = "TipType";
  c1.ColumnName = "whatever";
  dt.Columns.Add(c1);
}

тогда вы должны поместить свое поколение outString туда, куда оно подходит, этот код, по крайней мере, должен быть легче отлаживать, и вы сможете быстрее найти, что происходит.

person Davide Piras    schedule 11.04.2013
comment
это исправило это. Ты прав; это комбинация этого исправления и того, что сказали два комментатора выше. - person JMarotta; 12.04.2013