You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C#批量导入Excel到SQL Server时自动添加Session获取的上传人

解决批量导入Excel时添加Uploaded By字段的问题

你的问题很典型——当使用SqlBulkCopy直接从Excel读取数据时,确实没法直接插入Excel里没有的额外字段(比如从Session获取的上传人)。下面是一个简单可行的解决方案,核心思路是先把Excel数据加载到DataTable中,添加上传人字段后再批量导入数据库:

修改后的完整代码

try 
{
    myExcelConn.Open();
    // 1. 用DataAdapter把Excel数据读取到DataTable
    OleDbDataAdapter adapter = new OleDbDataAdapter("SELECT * FROM [Sheet1$]", myExcelConn);
    DataTable excelData = new DataTable();
    adapter.Fill(excelData);
    
    // 2. 添加"uploaded by"列到DataTable
    excelData.Columns.Add("uploaded by", typeof(string));
    
    // 3. 从Session获取上传人值,给每一行赋值
    string uploadedBy = Session["UploadedBy"]?.ToString();
    if(string.IsNullOrEmpty(uploadedBy))
    {
        throw new Exception("上传人信息未找到,请检查Session状态");
    }
    foreach(DataRow row in excelData.Rows)
    {
        row["uploaded by"] = uploadedBy;
    }

    // 4. 批量导入到SQL Server
    string sCon = sqlconn;
    using (SqlConnection con = new SqlConnection(sCon)) 
    {
        con.Open();
        using(SqlBulkCopy oSqlBulk = new SqlBulkCopy(con))
        {
            oSqlBulk.DestinationTableName = "Table3";
            // 映射所有字段,包括新增的"uploaded by"
            oSqlBulk.ColumnMappings.Add("name", "name");
            oSqlBulk.ColumnMappings.Add("address", "address");
            oSqlBulk.ColumnMappings.Add("country", "country");
            oSqlBulk.ColumnMappings.Add("uploaded by", "uploaded by");
            oSqlBulk.WriteToServer(excelData);
        }
    }

    lblConfirm.Text = "DATA IMPORTED SUCCESSFULLY.";
    lblConfirm.Attributes.Add("style", "color:green"); 
} 
catch (Exception ex) 
{
    lblConfirm.Text = ex.Message;
    lblConfirm.Attributes.Add("style", "color:red"); 
} 
finally 
{
    // 清理资源
    myExcelConn?.Close();
    myExcelConn = null;
}

关键修改点说明

  • 改用DataTable存储数据:相比直接用OleDbDataReader,DataTable允许我们灵活添加新列和修改数据;
  • 添加上传人列:给DataTable新增与数据库表匹配的"uploaded by"列;
  • 批量赋值上传人:遍历每一行数据,把Session中的上传人值填充到新列;
  • 更新列映射:在SqlBulkCopy的列映射中加入新增的字段,确保数据能正确对应到数据库表的列;
  • Session空值检查:避免因Session丢失导致的空值插入问题,增强代码健壮性。

额外提示

如果你的Excel数据量非常大(比如十万行以上),使用DataTable可能会占用较多内存。这种情况下可以考虑自定义一个IDataReader包装类,在读取Excel数据的同时注入上传人字段,不过对于大多数常规场景,DataTable的方案已经足够简单高效。

内容的提问来源于stack exchange,提问作者Aravindhan R

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:44:06