C# System.Data.DuplicateNameException:名为“Item”的列已属于此DataTable
我有一个扩展方法将IEnumerable转换为数据表,它抛出了这个异常。System.Data.DuplicateNameException:名为“Item”的列已属于此DataTable。令人困惑的是,该表中没有名为“Item”的列,或者至少不应该有,因为创建它的SqlTable没有“Item”列C# System.Data.DuplicateNameException:名为“Item”的列已属于此DataTable,c#,datatable,C#,Datatable,我有一个扩展方法将IEnumerable转换为数据表,它抛出了这个异常。System.Data.DuplicateNameException:名为“Item”的列已属于此DataTable。令人困惑的是,该表中没有名为“Item”的列,或者至少不应该有,因为创建它的SqlTable没有“Item”列 public static DataTable ToDataTable<T>(this IEnumerable<T> items) { var dataTable =
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;
}
我尝试在扩展方法中检查列是否已经被添加,但是得到了
System.Reflection.TargetParameterCountException:参数计数不匹配
如何使用DataTable作为可枚举项来更新每行的一列,并使其再次成为DataTable?作为补充,为什么要使用反射从数据库查询创建DataTable,而不是使用DataAdapter.Filltable?此外,已经有一个用于此目的的CopyToDataTable可用于任何类型:
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;
}
foreach (var prop in props)
{
if (dataTable.Columns.Contains(prop.Name))
dataTable.Columns.Add(prop.Name, prop.PropertyType);
}