如何在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
相关产品推荐
相关产品推荐

