【问题标题】:C# DataTable Add Column DuplicateNameExceptionC# DataTable 添加列 DuplicateNameException
【发布时间】:2013-04-11 20:31:20
【问题描述】:

我正在尝试在 C# 数据集中的数据表中添加一列(数据集是从 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 方法。任何建议表示赞赏。

【问题讨论】:

  • 底线,你不能有 2 列同名。你永远不会到达dt.Columns.Contains("whatever") 看到true,因为你的代码在dt.Columns.Add(c1); 中断
  • 我没听明白,但是您在表中添加了“Whatever”列,然后在下一次如果您的第一个 foreach 中的两个条件都为真,您将再次在表中添加“Whatever”。跨度>
  • @Kashif - 我显然试图将同一列多次添加到同一个表中。相当菜鸟的错误。谢谢!

标签: c# datatable columnname


【解决方案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代放在合适的地方,这段代码至少应该更容易调试,你可以更快地找到发生了什么。

【讨论】:

  • 这修复了它。你说得对;这是这个修复和上面两位评论者所说的结合。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-30
  • 2021-01-22
  • 1970-01-01
  • 2019-11-02
  • 1970-01-01
  • 2015-10-16
  • 1970-01-01
相关资源
最近更新 更多