业务中经常会遇到批量导入数据库的操作,今天总结一下方法.
本文利用三层的架构的思想。将整个业务分成三部分,分别是界面,业务和数据处理。
先介绍第一种方法:
即先将Excel表格的内容转化到DataTable中,然后再将DataTable导入到SqlServer数据库.
下面看一个小demo
界面上用到的控件是FileUpload和Button
- <span style="font-size: 18px;">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不存在");
- }
- }</span>
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,所以放到了逻辑层.
- <span style="font-size: 18px;"> /// <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();
- }
- }</span>
/// <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中
- <span style="font-size: 18px;">/// <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;
- }</span>
/// <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表的字段,而且导入时是默认从左到右字段一一对应,如果不需要导入和数据库相等的字段,且字段不连续,可以用数组进行字段的控制.
在数据库进行映射时的代码如下,其他代码相同,不再赘述.
- <span style="font-size: 18px;"> int[] intSqlFeild = { 0, 7 };
- for (int i = 0; i < dt.Columns.Count; i++)
- {
- //建立映射
- sqlbulk.ColumnMappings.Add(i , intSqlFeild[i]);
- }</span>
int[] intSqlFeild = { 0, 7 };
for (int i = 0; i < dt.Columns.Count; i++)
{
//建立映射
sqlbulk.ColumnMappings.Add(i , intSqlFeild[i]);
}
通过这种方式可以将Excel表的数据和数据库灵活绑定.但相对来说代码较多.
ps:由于本文着重实现功能,这个demo的复用性可能不好,如果工程中很多表,很多数据库中需要用到,可以进行重构,将关于表和数据库的内容提取出来,写成要传的参数或者配置文件.B层和D层的方法也可以更细的拆分.
相关推荐
【SQL Server 2016】中导入EXCEL 2013表数据的方法 在SQL Server 2016中,有多种方法可以将EXCEL 2013的数据导入到数据库中,主要包括以下三种: 1. **SQL Server Management Studio (SSMS) 中导入** - 首先,...
首先,导入Excel数据到SQL Server通常有几种方法:使用SQL Server Management Studio (SSMS) 的“导入和导出数据”向导、T-SQL语句(如BULK INSERT或OPENROWSET函数)以及编写存储过程。标题提到的“通过自动编写...
### SQL Server导入Excel数据的方法详解 #### 一、前言 在日常工作中,我们经常会遇到需要将Excel数据导入到SQL Server数据库中的情况。这不仅能够提高数据处理的效率,还能确保数据的一致性和准确性。本文将详细...
3. 数据匹配与校验:确保被导入的Excel工作表中的列数和程序中设定的列数相匹配,数据的第一列第一行必须有数据,以便准确地将数据导入到SQLServer数据库中。 4. 数据库连接与临时表创建:通过ADO技术创建数据库...
总的来说,通过T-SQL脚本导入Excel数据虽然相比图形化界面操作略显复杂,但对于熟悉SQL的用户来说更灵活且高效。在实际操作中,应确保遵循以上步骤,并根据实际环境调整相关设置,以确保导入过程的顺利进行。这个...
标题和描述中提到的方法允许我们避免将Excel数据导入到数据库中,而是直接在SQL Server中对Excel文件进行查询或处理。以下是关于如何在SQL Server中直接读取Excel文件的详细知识: 1. **安装Access Database Engine...
总结来说,使用WInform程序将Excel导入SQL Server数据库涉及多个步骤,包括设计用户界面、读取Excel、建立数据库连接、数据转换、批量插入和异常处理。这个过程需要对.NET编程、Excel操作以及SQL Server管理有深入的...
3. **T-SQL语句**:使用Transact-SQL(T-SQL)可以直接从Excel文件导入数据到SQL Server表,或者将数据导出到CSV文件,再由Excel打开。例如,BULK INSERT命令适用于大批量导入,而SELECT INTO语句可用于创建新表并...
这个压缩包文件"Excel导入SQLserver源码_excel2sql.zip"很可能包含了一个程序或脚本,用于自动化从Excel文件批量导入数据到SQL Server的过程。通常,这样的工具会使用编程语言如Python、C#、VB.NET或PowerShell来...
在IT行业中,数据管理和操作是至关重要的任务,尤其是在企业级应用中。...以上就是关于“Excel导入SQL Server数据库源码”的主要知识点,涵盖了数据迁移的多种方式以及编程实现的细节,希望能对你的工作提供帮助。
在本场景中,我们探讨的是如何使用C#程序将Excel数据导入到SQL Server数据库,这是一个常见的任务,尤其在处理大量表格数据时。下面将详细介绍这个过程涉及的主要知识点。 首先,我们需要了解基础的C#编程概念,...
SQL Server 是一个功能强大且广泛使用的关系数据库管理系统,它提供了多种方式来导入数据,其中之一就是从 Excel 文件中导入数据。本文将详细介绍如何使用 SQL Server Management Studio 将 Excel 文件中的数据导入...
Excel导入SQLserver源码 Excel是一种非常灵活的电子表格软件,用它可以存储各种数据,本节将对如何将Excel导入SQL Server2000数据库进行详细介绍。 开发环境:NET2.0 开发工具:vs2005 开发语言:c# 数据库:server...
另一方面,从SQL Server导入到Excel则常用于数据分析和报告编制。通过编写SQL查询获取所需数据,然后利用C#的Microsoft.Office.Interop.Excel库,可以直接将查询结果写入Excel工作表。在这个过程中,你需要创建Excel...
《XlsToSql:Excel数据高效导入SqlServer的实用工具》 在信息技术领域,数据库管理和数据处理是日常工作中不可或缺的部分。Microsoft SQL Server(简称SqlServer)作为一款广泛应用的关系型数据库管理系统,其强大...
Web页面中sqlserver快速导入excel,生成csv格式 有的程序在Web页SQLSERVER导入excel的过程中,会出现下载时找不到样式的错误提示。本资源避免了以上问题,快速打开,快速导出。 c#.Net2005下运行成功。
在SQL Server 2008 R2中,从Excel导入数据是一个常见的操作,这有助于将大量数据快速转移到数据库系统,以便进行分析、处理或存储。然而,这个过程可能会遇到一些挑战,以下是一些关键点,确保您能顺利进行数据导入...
"SQLSERVER表导入EXCEL小工具"就是这样一个实用程序,它简化了从SQL Server数据库向Excel电子表格转移数据的过程。 SQL Server是一个强大的关系数据库管理系统,广泛用于存储、管理及分析大量结构化数据。而Excel则...
标题中的"vc Excel导入SQLserver"指的是在Visual C++(VC++)环境下,将Excel文件中的数据导入到SQL Server数据库中的过程。这个过程通常涉及到使用SQL语句或者借助于特定的数据传输工具。描述中提到的方法是通过SQL...