如何通过Visual Studio将Excel数据导入SQL Server?代码读取值失败求助
问题解答
我来帮你搞定这两个问题哈~
一、如何使用Visual Studio将Excel中的数据导入SQL Server?
这里给你分享两种常用的方法:
方法1:用SQL Server导入导出向导(可视化操作,适合快速上手)
- 打开Visual Studio,先连接上你的SQL Server数据库
- 在「服务器资源管理器」里右键点击目标数据库,选「任务」→「导入数据」
- 数据源选「Microsoft Excel」,选中你的Excel文件,记得匹配正确的Excel版本(比如Excel 2016)
- 目标选择你的SQL Server数据库,填好服务器名称和认证信息
- 选择「复制一个或多个表或视图的数据」,接着挑选要导入的Excel工作表
- 可以先预览数据确认没问题,最后点击「完成」就开始导入啦
方法2:用ADO.NET代码手动导入(适合需要自定义逻辑的场景)
这种方式灵活性更高,步骤大概是:- 用OLEDB或者EPPlus这类库,把Excel数据读到DataTable或者集合中
- 用
SqlConnection建立和SQL Server的连接 - 用
SqlCommand执行插入操作,一定要用参数化查询,别直接拼字符串,避免SQL注入风险
二、修复你的Excel数据插入SQL Server代码问题
你写的代码跑不起来,主要踩了这几个坑:
- SQL语句拼接错误:你直接把
WB.Cells[i, 1]写到SQL字符串里,数据库会把它当成普通文本,根本不会读取Excel单元格的实际值 - 未获取单元格真实值:要拿到单元格内容,得用
WB.ActiveSheet.Cells[i, 1].Value2 - 未执行SQL命令:循环里只设置了
CommandText,但没调用cmd.ExecuteNonQuery(),等于只写了命令没执行 - 存在SQL注入风险:直接拼接字符串容易被攻击,必须用参数化查询
下面是修正后的代码,你可以参考:
// 假设你已经初始化好SqlConnection conn,并且打开了连接 Workbook WB = Globals.ThisAddIn.Application.ActiveWorkbook; int lastrow = WB.ActiveSheet.UsedRange.Rows.Count; // 定义参数化查询模板,避免SQL注入 string insertSql = "INSERT INTO Table_1 (emp_no, emp_name, salary) VALUES (@EmpNo, @EmpName, @Salary)"; for (int i = 2; i <= lastrow; i++) { // 读取Excel单元格的值,同时处理空值情况 var empNo = WB.ActiveSheet.Cells[i, 1].Value2; var empName = WB.ActiveSheet.Cells[i, 2].Value2; var salary = WB.ActiveSheet.Cells[i, 3].Value2; // 用using包裹SqlCommand,自动释放资源 using (SqlCommand cmd = new SqlCommand(insertSql, conn)) { // 给参数赋值,空值转成DBNull.Value避免SQL报错 cmd.Parameters.AddWithValue("@EmpNo", empNo ?? DBNull.Value); cmd.Parameters.AddWithValue("@EmpName", empName ?? DBNull.Value); cmd.Parameters.AddWithValue("@Salary", salary ?? DBNull.Value); // 执行插入操作 cmd.ExecuteNonQuery(); } }
额外提醒几点:
- 记得用
using包裹SqlConnection,确保连接用完自动关闭,避免资源泄漏 - 如果Excel数据量很大,用
SqlBulkCopy批量插入会比逐行插入效率高很多 - 一定要处理空值,不然遇到空单元格会触发SQL报错
内容的提问来源于stack exchange,提问作者suga
相关产品推荐
相关产品推荐

