业务中经常会遇到批量导入数据库的操作,今天总结一下方法.

本文利用三层的架构的思想。将整个业务分成三部分,分别是界面,业务和数据处理。

先介绍第一种方法:

即先将Excel表格的内容转化到DataTable中,然后再将DataTable导入到SqlServer数据库.

下面看一个小demo

界面上用到的控件是FileUpload和Button

protected void btnImport_Click(object sender, EventArgs e)
{
string path;//定义文件保存的路径
// 检查FileUpload是否有指定文件
if (fupImport.PostedFile == null || fupImport.PostedFile.FileName == "")
{
Response.Write("<script>alert('请您选择Excel文件')</script> ");
return;
}
//System.IO.Path.GetExtension获得文件的扩展名
string fileExt = System.IO.Path.GetExtension(fupImport.FileName).ToString().ToLower();
if (fileExt == ".xls" || fileExt == ".xlsx")
{
//给文件设置路径
path = "TempPlace/" + this.fupImport.FileName.ToString().Trim();
//将虚拟路径转化为物理路径
path = Server.MapPath(path);
fupImport.SaveAs(path);
//调用b层的方法把Excel写入到数据库
if (new BLL().ExcelToDataTable(path))
{
//成功导入到sql
Response.Write("<script>alert('导入成功')</script>");
}
}
else
{
//当选择的不是Excel文件时,返回
Response.Write("<script>alert('只可以选择Excel文件')</script>");
return;
}
if (System.IO.File.Exists(path))
{
System.IO.File.Delete(path);
}
else
{
Response.Write("该Excel不存在");
}
}

逻辑层的主要任务是将界面传过来的Excel转化到DataTable中,并将DataTable传给Dal层处理.因为读取Excel的操作不是针对的Sql,而是用的OLEDB,所以放到了逻辑层.

 /// <summary>
/// 将坐在路径的Excel中的内容写入到DataTable中
/// </summary>
/// <param name="strPath">需要导入的Excel的路径</param>
/// <returns>返回true 或false</returns>
public bool ExcelToDataTable(string strPath)
{
DataTable DT = new DataTable();
//设置数据连接
// HDR = "YES",第一行是标题 ,则第一行不写如数据库;
//HDR = "NO" 第一行是数据  ,则第一行写入数据库;    这个选择可以由界面当作参数传下来.
OleDbConnection objConn = new System.Data.OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;data source=" + strPath + ";Extended Properties='Excel 12.0 Xml;HDR=YES'");
//打开连接
objConn.Open();
try
{
//获取 Excel 的表名,默认值是sheet1
DataTable schemaTable = objConn.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, null);
string sheetName = string.Empty;
sheetName = schemaTable.Rows[0][2].ToString().Trim();
//Sql语句
//string strExcel = string.Format("select * from [{0}$]", strSheetName); 这是一种方法
//string strExcel = "select * from   [" + sheetName + "]";
string strExcel = "select * from [Sheet1$]";
//定义存放的数据表
DataSet ds = new DataSet();
//连接数据源
OleDbDataAdapter adapter = new OleDbDataAdapter(strExcel, objConn);
//将Excel表中内容填入ds中
adapter.Fill(ds, sheetName);
//调用d层方法
return new DAL().BatchInsertData("user_Info", ds.Tables[sheetName]);
}
catch (SqlException ex)
{
throw ex;
}
finally
{
//关闭连接
objConn.Close();
objConn.Dispose();
}
}

D层,具体处理,将得到的DataTable批量导入到Sql中

/// <summary>
/// 将传过来的DataTable导入到Sql
/// </summary>
/// <param name="strTableName">要导入的sql数据库表名</param>
/// <param name="dt">待导入的数据表</param>
/// <returns></returns>
public bool BatchInsertData(string strTableName, DataTable dt)
{
bool blnResult;
//初始化连接
string strConn = "server=192.168.*.*;database=Student;uid=sa;pwd=123";
SqlConnection objConn = new SqlConnection(strConn);
objConn.Open();
//数据批量导入sqlserver,创建实例
System.Data.SqlClient.SqlBulkCopy sqlbulk = new System.Data.SqlClient.SqlBulkCopy(objConn);
//目标数据库表名
sqlbulk.DestinationTableName = strTableName;
try
{
//数据集字段索引与数据库字段索引映射
for (int i = 0; i < dt.Columns.Count; i++)
{
sqlbulk.ColumnMappings.Add(i, i);
}
//导入
sqlbulk.WriteToServer(dt);
//导入成功
blnResult = true;
}
catch (Exception)
{
blnResult = false;
throw;
}
finally {
//关闭连接
sqlbulk.Close();
objConn.Close();
}
return blnResult;
}

这样通过两次调用,Excel就可以顺利导入数据库了,这种方法必须是数据库字段>=Excel表的字段,而且导入时是默认从左到右字段一一对应,如果不需要导入和数据库相等的字段,且字段不连续,可以用数组进行字段的控制.

在数据库进行映射时的代码如下,其他代码相同,不再赘述.

            int[] intSqlFeild = { 0, 7 };
for (int i = 0; i < dt.Columns.Count; i++)
{
//建立映射
sqlbulk.ColumnMappings.Add(i , intSqlFeild[i]);
}

通过这种方式可以将Excel表的数据和数据库灵活绑定.但相对来说代码较多.

ps:由于本文着重实现功能,这个demo的复用性可能不好,如果工程中很多表,很多数据库中需要用到,可以进行重构,将关于表和数据库的内容提取出来,写成要传的参数或者配置文件.B层和D层的方法也可以更细的拆分.

Excel导入SqlServer数据库(一)相关推荐

  1. excel导入sqlserver数据库大数据量,可每秒控制数量

    数据库代码 USE [Test] GO /****** Object:  Table [dbo].[Table_1]    Script Date: 11/07/2017 17:27:29 ***** ...

  2. powershell excel 导入 sqlserver

    powershell excel 导入 sqlserver 更新 多表导入,这之前基础上稍加改动. cls$SqlConnection = New-Object System.Data.SqlClie ...

  3. oracle如何导入excel数据库文件,如何将excel导入oracle数据库的教程

    在Excel中录入好数据以后就需要导入到oracle数据库,或许有些朋友不知道该如何做.下面是学习啦小编带来的关于如何将excel导入oracle数据库的教程,欢迎阅读! 如何将excel导入orac ...

  4. 将Excel导入SAP数据库表

    将Excel导入SAP数据库表 https://blog.csdn.net/sunnyonly1992/article/details/51538522?spm=1001.2014.3001.5502 ...

  5. 解决Excel导入mysql数据库时汉字乱码的问题_MySQL

    解决Excel导入mysql数据库时汉字乱码的问题_MySQL 1.用下面的命令查看数据库是否采用的是UTF-8编码 show variables like 'char%' 2.将Excel另存为cs ...

  6. 大数据量高效导入数据库(以excel导入sqlserver为例)

    本人文章陆续转向本人微信公账号发布 公众号:搬砖码农SmallNNN,期望您要是搬砖码农,一起学习探讨,祝您阅读愉快. 最近正在做一个项目,要把excel中的数据导入到sqlserver数据库中,首先 ...

  7. 对未安装office,不支持excel各版本的数据库进行excel导入sqlserver

    现在很多运营商越来越少自己部署服务器了,很多时候都是租用别的服务商的服务器,但这样就有很多麻烦事,比如数据库服务器没安装office,无法直接导入excel的内容 现在有一个稍微复杂点的办法来解决这个 ...

  8. SpringBoot中使用POI实现Excel导入到数据库(图文教程已实践)

    场景 IDEA中开发SpringBoot项目时需要将Excel模板中数据导入的到数据库. Excel模板如下 实现思想 首先将模板上传到服务器中某路径,并将当前路径存储,然后使用POI自带的 工具类获 ...

  9. excel 导入 sqlserver 字符串被截取为255长度解决方案

    原文出处: http://blog.csdn.net/xiaoma0529/article/details/21336535 excel表格导入sqlserver数据表中 内容被截取为255长度的字符 ...

最新文章

  1. mysql查询哪天,Mysql日期查询的详细介绍
  2. 走火入魔 | 暑期电子设计课程学生们的作品
  3. 十一、Android学习第十天——项目开始(转)
  4. JSP怎么将表单提交到对应的servlet
  5. python内置json模块的作用_python详解json模块
  6. poj3111 选取物品(二分+贪心)
  7. Jerry Wang的ABAP Development Tool培训材料 - SAP 引入ADT的初衷
  8. CCNA课堂精简笔记
  9. 一颗钉子能承受多大的重量?
  10. 客户说发货慢怎么回复_女生微信说身体不舒服怎么回复关心她?
  11. android studio aspectj使用,androidStudio中使用 AspectJ
  12. Docker介绍及安装
  13. 【redis】Redis简介
  14. 你还要我怎样的JS系列(4) -- 作用域链
  15. c语言程序设计 简述操作系统管理文件的方法,C语言程序设计基础实验.doc
  16. 35款FL插件免费下载
  17. Docker与Dragonfly详细多机部署
  18. python立方根求解_python 二分查找(立方根)
  19. 又一次回归,再一次记录
  20. Windows Project2016如何增加加班工时。

热门文章

  1. 求助:无法定位序数于动态链接库....SSLEAY32.dll上
  2. sta计算机控制局麻,关于申请新增计算机控制下局部麻醉医疗服务价格项目的报告...
  3. 如何在WPS表格中插入一张图片,不影响表格格式
  4. android点击应用没有反应,Android 应用菜单项点击没反应的问题
  5. Web开发到微信小程序
  6. 投资 5 -- 股票卖出的判断核心依据
  7. 王者微信哪个服务器好,王者荣耀:微信区QQ区除了实力差异巨大,还有哪些不一样之处?...
  8. (附源码)springboot 中小学餐饮配送系统 毕业设计645661
  9. 计算机组成原理-电大mooc
  10. es对已有的索引给主键_Elasticsearch(ES) 创建索引