2013-04-11 2 views
1

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

Вот соответствующий кодовый блок (хК является определено ранее XmlTextReader, и это все, в то время как 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 (» что бы ни была "), строка всегда возвращает False. Так что это не истинный DuplicateNameException. Я уверен, что я просто внедряю метод Columns.Add неправильно. Любые советы приветствуются.

+0

Нижняя линия, вы не можете иметь 2 столбца с одинаковым именем. Вы никогда не достигнете 'dt.Columns.Contains (" whatever ")', чтобы видеть 'true', потому что ваш код разбивается на' dt.Columns.Add (c1); ' – banging

+0

Я не получил его, но вы добавляете 'Whatever столбец в таблице, а затем в следующий раз, если оба условия в вашем первом foreach верны, вы снова добавляете «Что угодно» в таблице. – Kashif

+0

@Kashif - Я, видимо, пытаюсь добавить один и тот же столбец в одну и ту же таблицу несколько раз. Довольно новобрачная ошибка. Благодаря! – JMarotta

ответ

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 поколение везде, где оно подходит, этот код, по крайней мере, должен быть проще отлаживать, и вы можете найти, что происходит быстрее.

+0

это исправлено. Ты прав; это комбинация этого исправления и то, что говорили два комментатора выше. – JMarotta

Смежные вопросы