如何使用ASP.Net SqlBulkCopy将常量值插入列中

7
在下面的代码中,我尝试将来自Excel的记录插入到数据库表中,但是一个额外的列没有通过Excel传递,必须用从请求页面分配的常量值(使用不同值的foreach循环)填充。
string CONSTANTVALUE="Test";
bulkCopy.DestinationTableName = "TABLE NAME";
bulkCopy.ColumnMappings.Add("TABLECOLUMN1", "EXCELCOLUMN1");
bulkCopy.ColumnMappings.Add("TABLECOLUMN2", "EXCELCOLUMN2");
bulkCopy.ColumnMappings.Add("TABLECOLUMN3", CONSTANTVALUE);
bulkCopy.WriteToServer(dr);

但是代码无法运行,有什么想法吗?
3个回答

6
你可以通过修改命令文本来实现。如下所示:

您只需更改命令文本即可完成。

string CONSTANTVALUE="Test";
OleDbCommand command=new OleDbCommand("select *,"+CONSTANTVALUE+" as [ConstantCol] from [sheet$]",ObleDbCon);
using (DbDataReader dr = command.ExecuteReader())
{
bulkCopy.DestinationTableName = "TABLE NAME";
bulkCopy.ColumnMappings.Add("TABLECOLUMN1", "EXCELCOLUMN1");
bulkCopy.ColumnMappings.Add("TABLECOLUMN2", "EXCELCOLUMN2");
bulkCopy.ColumnMappings.Add("TABLECOLUMN3", "ConstantCol");
bulkCopy.WriteToServer(dr);
}

这段代码对我非常有效,但有两点需要注意:1)ColumnMappings.Add的参数为(sourceColumn,destinationColumn)。因此,如果您要从Excel中复制到数据库表中,则参数应该翻转,它应该是bulkCopy.ColumnMappings.Add("EXCELCOLUMN1", "TABLECOLUMN1");2)如果您要在Excel中使用列名,则您的Excel连接字符串需要包括HDR=Yes。我发现使用索引更容易,这样我就不必依赖于创建电子表格的人使用正确的标题名称。谢谢! - Eric Barr

5

我猜你的dr是某种读取器。它是如何填充的?可能可以将默认值选择到列中并进行映射。类似这样(SQL语法):

select 
    EXCELCOLUMN1, 
    EXCELCOLUMN2, 
    'ConstantValueFromPage' as EXCELCUSTOM 
from 
    sheet1

然后有:
bulkCopy.ColumnMappings.Add("TABLECOLUMN3", "EXCELCUSTOM");

HTH


想象一下默认值是一个非常长的字符串。在传输数据结构(Oracle或SqlServer驱动程序)和ADO.NET DataTable中,每行重复出现的冗余默认值是否会被优化掉? - Patrick Fromberg

0
你尝试在数据库中为列设置默认值了吗?我认为这是最简单的方法,因为在插入任何记录后,默认值也会被插入到指定的列中(它就像触发器一样)。

1
根据问题,我认为每个请求的常量值可能不同。你如何设置默认值? - suryakiran
在这种情况下,我认为您可以使用SMO(服务器管理对象,用于在代码中与SQL Server一起工作的API)来更改列的默认值,然后再插入新记录。 - Saeed Neamati

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接