评估DataTable表达式

时间:2014-07-14 12:56:32

标签: c# excel oledb

我有一个DataTable,它是通过读取Excel文件(使用OLEDB连接)构建的。我想添加一个列,其中包含所有列中值的逗号分隔列表。

因此,如果我有FirstName,LastName,Address,那么我想要第4列,它是FirstName,LastName和Address的逗号分隔串联。我宁愿不迭代记录,因为可能有100,000到1,000,000个记录。有没有办法在SQL语句中执行此操作?我有"select * from [" + sheetName[i] + "]",其中sheetName[i]是当前循环的当前工作表名称(循环遍历X张数)。

最后,我正在构建一个完全不同的DataTable,其中包含我将用于在我的SQL Server数据库中对表执行SqlBulkCopy的列。我添加了此批量复制所需的列,然后将我的数据表从Excel工作表合并到我新创建的DataTable的末尾。然后我在我使用的地方添加了一个新列。表达式以逗号分隔我的字段与Excel工作表数据表。但是,我的新DataTable必须与我正在批量复制的表一样精确。所以我想删除不在我的SQL表中的列,但是当我尝试删除这些列时,我得到错误(这是有意义的),因为它们是其他列之一的Expression的一部分。

那么,有没有办法查询Excel文件以连接以逗号分隔的新列?或者强制对数据表达式求值,以便它评估表达式并将计算出的字符串存储到该列而不是单独使用表达式?

2 个答案:

答案 0 :(得分:0)

  

有没有办法查询Excel文件以连接以逗号分隔的新列?

等效的SQL将是:

select 
    *,
    FirstName + ", " + LastName + ", " + Address AS AllFields
from [" + sheetName[i] + "]"

此外,如果您有特定的目标格式,我建议明确说明列而不是使用"*"

select 
    FirstName, 
    LastName, 
    Address,
    FirstName + ", " + LastName + ", " + Address
from [" + sheetName[i] + "]"

答案 1 :(得分:0)

如果在.NET Framework中使用 System.Data.DataTable ,则可以使用可用于 DataColumn 的表达式属性。在此链接DataColumn.Expression Property上讨论了这个问题。

下面是一些简单的代码,用于说明如何使用 Expression 属性将列连接到DataTable本身的逗号分隔字符串中。

DataTable table = new DataTable();

// create the columns 
DataColumn firstNameColumn = new DataColumn();
firstNameColumn.DataType = System.Type.GetType("System.String");
firstNameColumn.ColumnName = "FirstName";
firstNameColumn.DefaultValue = string.Empty;

DataColumn lastNameColumn = new DataColumn();
lastNameColumn.DataType = System.Type.GetType("System.String");
lastNameColumn.ColumnName = "LastName";
lastNameColumn.DefaultValue = string.Empty;

DataColumn addressColumn = new DataColumn();
addressColumn.DataType = System.Type.GetType("System.String");
addressColumn.ColumnName = "Address";
addressColumn.DefaultValue = string.Empty;

// this column uses an Expression to concatenate others together in comma delim
DataColumn concatColumn = new DataColumn();
concatColumn.DataType = System.Type.GetType("System.String");
concatColumn.ColumnName = "Concatenated";
concatColumn.Expression = "FirstName + ', ' + LastName + ', ' + Address"; 

// add columns to DataTable 
table.Columns.Add(firstNameColumn);
table.Columns.Add(lastNameColumn);
table.Columns.Add(addressColumn);
table.Columns.Add(concatColumn); 

// add some rows
DataRow row1 = table.NewRow();
row1["FirstName"] = "John";
row1["LastName"] = "Doe";
row1["Address"] = "123 East Street";
table.Rows.Add(row1);

DataRow row2 = table.NewRow();
row2["FirstName"] = "Bill";
row2["LastName"] = "Smith";
row2["Address"] = "444 North Avenue";
table.Rows.Add(row2); 

// simple iteration to print out the concatenated column
foreach (DataRow dr in table.Rows)
   Console.WriteLine(dr["Concatenated"]);