System.Data.DuplicateNameException:名为“Item”的列已属于此DataTable

时间:2014-11-07 22:19:28

标签: c# datatable

我有一个扩展方法将IEnumerable转换为数据表,并抛出此异常。 System.Data.DuplicateNameException: A column named 'Item' already belongs to this DataTable.令人困惑的是,没有列名为' Item'在这个表中,或者至少不应该因为它创建的SqlTable没有' Item'列。

public static DataTable ToDataTable<T>(this IEnumerable<T> items)
{
    var dataTable = new DataTable(typeof(T).Name);

    var props = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance);

    foreach (var prop in props)
    {
        dataTable.Columns.Add(prop.Name, prop.PropertyType);
    }

    foreach (var item in items)
    {
        var values = new object[props.Length];
        for (var i = 0; i < props.Length; i++)
        {
            values[i] = props[i].GetValue(item, null);
        }

        dataTable.Rows.Add(values);
    }

    return dataTable;
}

这种扩展方法一直在工作,除非直到现在我将它与一个接受sql表并使其成为数据表的方法一起使用,然后将数据表转换为IEnumerable以更新一列,然后使用扩展方法Ienumerable将它变回数据表。

var strSqlQuery = "Select * FROM " + strTableName; 

var dataTable = Database.CreateDataTableFromDatabaseTable(strSqlQuery);
var ocRows = dataTable.AsEnumerable(); // turn the data table into an enumerable we can sqlbulkcopy dump later

foreach (var dataRow in ocRows)
{
    if (dataRow[4].ToString().Contains("COMPLETED")) continue;
    // Generate and Save Needed Hashes for this Node
    // This is the algorithm to generate the hash
    var md5Hash = MD5.Create();
    var profileId = Database.GetProfileIdByEndPage(dataRow[3].ToString(), false);
    var endPageId = Database.GetEndPageId(navigationProfileId);
    var strValuesForObjectHash = string.IsNullOrEmpty(dataRow[6].ToString()) // if the "id" is null or empty use xpath
        ? endPageId + "," + dataRow[7]  // use the xpath for the object hash, not the "id"
        : endPageId + "," + dataRow[6]; // if the id has a value use the id for the object hash
    var currentObjectHash = strValuesForObjectHash.GetMd5Hash(md5Hash);
    dataRow[1] = currentObjectHash;
}

我尝试使用扩展方法来检查列是否已经添加但是后来了 System.Reflection.TargetParameterCountException: Parameter count mismatch.

foreach (var prop in props)
{
    if (dataTable.Columns.Contains(prop.Name))
    dataTable.Columns.Add(prop.Name, prop.PropertyType);
}

如何使用DataTable作为可枚举来更新每一行的一列并再次将其变为DataTable?

0 个答案:

没有答案