效率最高的Excel数据导入---(c#调用SSIS Package将数据库数据导入到Excel文件中【附源代码下载】)

本文涉及的产品
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
云数据库 RDS SQL Server,基础系列 2核4GB
简介:

本文目录:

(一)背景

(二)数据库数据导入到Excel的方法比较
(三)SSIS的简介
(四)数据库中存储过程示例(SSIS应用需要)

(五)Excel模板的制作(这步这么简单,稍微介绍一下)
(六)SSIS操作过程(生成Package,用来调用)(下一篇随笔将详细讲解制作Package包的过程,图片太多,篇幅过长,因此本文将直接采用生成的Package包进行应用)

(七)C#中如何调用SSIS创建的Package和Excel模板(可以自己编写逻辑代码进行重复利用),用来生成Excel数据

(八)总结

(一)背景

如何将数据库中的数据导入到EXCEL文件中,我们经常会碰到。本文将比较常用的几种方法,并且将详细讲解基于SSIS的用法。笔者认为,基于SSIS的方法,对于海量数据来说,应该是效率最好的一种方法。个人认为,这是一种值得推荐的方法,因此,本人决定将本人所知道的、以及自己总结的完整的写出来,一是提高一下自己的写作以及表达能力,二是让更多的读者能够在具体的应用中如何解决将海量数据导入到Excel中的效率问题。

 

(二)方法的比较

方案一:SSIS(SQL Server数据集成服务),追求效率,Package制作过程复杂一点(容易出错)。

方案二:采用COM.Excel组件。一般,对于操作能够基本满足,但对于数据量大时可能会慢点。下面的代码,本人稍微修改了下,如下所示:该方法主要是对单元格一个一个的循环写入,基本方法为 excel.WriteValue(ref vt, ref cf, ref ca, ref chl, ref rowIndex, refcolIndex, ref str, ref cellformat)。当数据量大时,肯定效率还是有影响的。

复制代码
复制代码
public string  DataExcels(System.Data.DataTable[] dts,  string  strTitle,  string  FilePath, Hashtable nameList, string [] titles)
{
COM.Excel.cExcelFile excel 
= new  COM.Excel.cExcelFile();
// 当文件大于10的时候 清空所有文件!!!
ClearFile(FilePath);
// 文件名
string  filename  =  strTitle +  DateTime.Now.ToString( " yyyyMMddHHmmssff " + " .xls " ;
// 生成相应的文件
excel.CreateFile(FilePath  +  filename);
// 设置margin
COM.Excel.cExcelFile.MarginTypes mt1  =  COM.Excel.cExcelFile.MarginTypes.xlsTopMargin;
COM.Excel.cExcelFile.MarginTypes mt2 
=  COM.Excel.cExcelFile.MarginTypes.xlsLeftMargin;
COM.Excel.cExcelFile.MarginTypes mt3 
=  COM.Excel.cExcelFile.MarginTypes.xlsRightMargin;
COM.Excel.cExcelFile.MarginTypes mt4 
=  COM.Excel.cExcelFile.MarginTypes.xlsBottomMargin;
double  height  = 2.2 ;
excel.SetMargin(
ref  mt1,  ref  height);
excel.SetMargin(
ref  mt2,  ref  height);
excel.SetMargin(
ref  mt3,  ref  height);
excel.SetMargin(
ref  mt4,  ref  height);
// 设置字体!!
COM.Excel.cExcelFile.FontFormatting ff  =  COM.Excel.cExcelFile.FontFormatting.xlsNoFormat;
string  font  = " 宋体 " ;
short  fontsize  = 14 ;
excel.SetFont(
ref  font,  ref  fontsize,  ref  ff);
byte  b1  = 1 , b2  = 12 ;
short  s3  = 12 ;
excel.SetColumnWidth(
ref  b1,  ref  b2,  ref  s3);

string  header  = " 页眉 " ;
string  footer  = " 页脚 " ;
excel.SetHeader(
ref  header);
excel.SetFooter(
ref  footer);

COM.Excel.cExcelFile.ValueTypes vt 
=  COM.Excel.cExcelFile.ValueTypes.xlsText;
COM.Excel.cExcelFile.CellFont cf 
=  COM.Excel.cExcelFile.CellFont.xlsFont0;
COM.Excel.cExcelFile.CellAlignment ca 
=  COM.Excel.cExcelFile.CellAlignment.xlsCentreAlign;
COM.Excel.cExcelFile.CellHiddenLocked chl 
=  COM.Excel.cExcelFile.CellHiddenLocked.xlsNormal;
//  报表标题
int  cellformat  = 1 ; 
int  rowIndex  = 1 ; // 起始行
int  colIndex  = 0 ;
foreach  (System.Data.DataTable dt  in  dts)

colIndex 
= 0 ;
// 取得列标题 
foreach  (DataColumn colhead  in  dt.Columns)
{
colIndex
++ ;
string  name  =  colhead.ColumnName.Trim();
object  namestr  =  ( object )name;
excel.WriteValue(
ref  vt,  ref  cf,  ref  ca,  ref  chl,  ref  rowIndex,  ref  colIndex,  ref  namestr,  ref  cellformat);
}
// 取得表格中的数据 
foreach  (DataRow row  in  dt.Rows)
{
rowIndex
++ ;
colIndex 
= 0 ;
foreach  (DataColumn col  in  dt.Columns)
{
colIndex
++ ;
if  (col.DataType  ==  System.Type.GetType( " System.DateTime " ))

object  str  =  ( object )(Convert.ToDateTime(row[col.ColumnName].ToString())).ToString( " yyyy-MM-dd " ); ;
excel.WriteValue(
ref  vt,  ref  cf,  ref  ca,  ref  chl,  ref  rowIndex,  ref  colIndex,  ref  str,  ref  cellformat);
}
else
{
object  str  =  ( object )row[col.ColumnName].ToString();
excel.WriteValue(
ref  vt,  ref  cf,  ref  ca,  ref  chl,  ref  rowIndex,  ref  colIndex,  ref  str,  ref  cellformat);
}
}
}
rowIndex 
+= 3  ;
}
int  ret  =  excel.CloseFile(); 
return  FilePath + filename;
}
复制代码
复制代码

 

 

方案三:采用Excel组件。一般,对于操作能够基本满足,但对于数据量大时可能会慢点。下面的代码,本人在原有基础上稍微修改了下,如下所示:

复制代码
复制代码
1  public string  OutputExceles( string  strTitle,  string  FilePath,  string  typeName, System.Data.DataTable[] dtList, string [] smallTitleList) 
2  {
3  beforeTime  =  DateTime.Now;
4  Excel.Application excel;
5  Excel._Workbook xBk;
6  Excel._Worksheet xSt;
7  int  rowIndex  = 1 ;
8  int  colIndex  = 1 ;
9  excel  = new  Excel.ApplicationClass();
10  xBk  =  excel.Workbooks.Add( true );
11  xSt  =  (Excel._Worksheet)xBk.ActiveSheet;
12  int  add = 0 ;
13  foreach  (System.Data.DataTable dt  in  dtList)
14  {
15  colIndex  = 1
16  // 取得整个报表的标题 
17  excel.Cells[rowIndex ,  1 =  smallTitle[add];
18  add ++ ;
19  /// /设置整个报表的标题格式 
20  xSt.get_Range(excel.Cells[rowIndex,  1 ], excel.Cells[rowIndex , dt.Columns.Count]).Font.Bold  = true ;
21  xSt.get_Range(excel.Cells[rowIndex,  1 ], excel.Cells[rowIndex , dt.Columns.Count]).Font.Size  = 22 ;
22  /// /设置整个报表的标题为跨列居中 
23  xSt.get_Range(excel.Cells[rowIndex ,  1 ], excel.Cells[rowIndex , dt.Columns.Count]).Select();
24  xSt.get_Range(excel.Cells[rowIndex ,  1 ], excel.Cells[rowIndex, dt.Columns.Count]).HorizontalAlignment  = Excel.XlHAlign.xlHAlignCenterAcrossSelection;
25  rowIndex ++ ;
26  foreach  (DataColumn col  in  dt.Columns)
27  {
28  excel.Cells[rowIndex, colIndex]  =  col.ColumnName;
29  // 设置标题格式为居中对齐
30  xSt.get_Range(excel.Cells[rowIndex, colIndex], excel.Cells[rowIndex, colIndex]).Font.Bold  = true ;
31  xSt.get_Range(excel.Cells[rowIndex, colIndex], excel.Cells[rowIndex, colIndex]).HorizontalAlignment  = Excel.XlVAlign.xlVAlignCenter;
32  xSt.get_Range(excel.Cells[rowIndex, colIndex], excel.Cells[rowIndex, colIndex]).Select();
33  xSt.get_Range(excel.Cells[rowIndex, colIndex], excel.Cells[rowIndex, colIndex]).Interior.ColorIndex  = titleColorindex;
34  colIndex ++ ;
35  }
36  // 取得表格中的数据 
37  foreach  (DataRow row  in  dt.Rows)
38  {
39  rowIndex ++ ;
40  colIndex  = 1 ;
41  foreach  (DataColumn col  in  dt.Columns)
42  {
43  if  (col.DataType  ==  System.Type.GetType( " System.DateTime " ))
44  {
45  if  ( ! string .IsNullOrEmpty(row[col.ColumnName].ToString()))
46  {
47  excel.Cells[rowIndex, colIndex]  =  (Convert.ToDateTime(row[col.ColumnName].ToString())).ToString( " yyyy-MM-dd " );
48  xSt.get_Range(excel.Cells[rowIndex, colIndex], excel.Cells[rowIndex, colIndex]).HorizontalAlignment  = Excel.XlVAlign.xlVAlignCenter; }
49  }
50  else if  (col.DataType  ==  System.Type.GetType( " System.String " ))
51  {
52  excel.Cells[rowIndex, colIndex]  = " ' " +  row[col.ColumnName].ToString();
53  xSt.get_Range(excel.Cells[rowIndex, colIndex], excel.Cells[rowIndex, colIndex]).HorizontalAlignment  = Excel.XlVAlign.xlVAlignCenter;r; }
54  else
55  {
56  excel.Cells[rowIndex, colIndex]  =  row[col.ColumnName].ToString();
57  xSt.get_Range(excel.Cells[rowIndex, colIndex], excel.Cells[rowIndex, colIndex]).HorizontalAlignment  = Excel.XlVAlign.xlVAlignCenter; }
58  colIndex ++ ;
59  }
60  }
61  rowIndex  ++ ;
62  }
63  afterTime  =  DateTime.Now;
64  xSt.Name  =  strTitle;
65  string  filename  =  typeName  +  DateTime.Now.ToString( " yyyyMMdd " + " .xls " ;
66  //  excel.Save(FilePath+filename);
67  excel.ActiveWorkbook.SaveCopyAs(FilePath  +  filename); 
68  #region  结束Excel进程
69  xBk.Close( null null null );
70  excel.Workbooks.Close();
71  excel.Quit();
72  #endregion
73  return  filename;
74  }
复制代码
复制代码

 

方法四:采用DataGrid,GridView自带的属性。如下:

复制代码
复制代码
private void  ExportExcelFromDataGrid( string  filename, System.Web.UI.WebControls.GridView ToExcelGrid)
{
Response.ClearHeaders();
Response.Clear();
Response.Expires 
= 0 ;
Response.Buffer 
= true ;
Response.HeaderEncoding 
=  System.Text.Encoding.UTF8;
//  Response.Charset = "utf-8";
Response.AppendHeader( " Content-Disposition " " attachment;filename= " +  Server.UrlEncode(filename));
Response.ContentEncoding 
=  System.Text.Encoding.Default; // 设置输出流为简体中文 
//  Response.ContentType = "application/ms-excel"; // 设置输出文件类型为excel文件。 
Response.ContentType  = " Application/octet-stream " ;
this .EnableViewState  = false ;
System.Globalization.CultureInfo myCItrad 
= new  System.Globalization.CultureInfo( " zh-CHS " true );
System.IO.StringWriter oStringWriter 
= new  System.IO.StringWriter(myCItrad);
System.Web.UI.HtmlTextWriter oHtmlTextWriter 
= new  System.Web.UI.HtmlTextWriter(oStringWriter);
ToExcelGrid.RenderControl(oHtmlTextWriter);
Response.Write(oStringWriter.ToString());
Response.End();
}
复制代码
复制代码


(三)SSIS的简介
SQL Server 2005 提供的一个集成化的商业智能开发平台,主要包括:   
*SQL Server Analysis Services(SQL Server数据分析服务,简称SSAS)   
*SQL Server Reporting Services(SQL Server报表服务,简称SSRS)   
SQL Server Integration Services(SQL Server数据集成服务,简称SSIS)

SQL Server 2005 Integration Services (SSIS) 提供一系列支持业务应用程序开发的内置任务、容器、转换和数据适配器。可以创建 SSIS 解决方案来使用 ETL 和商业智能解决复杂的业务问题,管理 SQL Server 数据库以及在 SQL Server 实例之间复制 SQL Server 对象。

(四)数据库中存储过程示例(SSIS应用过程中需要的,最好拿个本子把需要的内容记下) 
在SQL SERVER 2005中,以SSISDataBase数据库作为应用,仅包括2张表City,Province.(主要是为了简单,便于讲解)

 

其中存储过程如下:

复制代码
复制代码
ALTER PROCEDURE  [dbo].[ProvinceSelectedCityInfo]
(
@provinceId  int = 0

as
begin
select P.EName 
as 省份拼音 ,P.CName  as 省份名 ,C.CName  as 城市名  from City C left join Province P
on C.ProvinceId 
=  P.ProvinceId
where  C.ProvinceId  = @provinceId and @provinceId  is  not  null  or @provinceId  is null  or @provinceId = 0
end
复制代码
复制代码

 

其中,在这一步中我们必须要记住相关的内容,如上标识(红色);为什么这么做?主要是在制作SSIS包的时候很容易混淆,建议拿个本子把需要的内容写好。

 
(五)Excel模板的制作(这步这么简单,稍微介绍一下)
因为SSIS中列映射对应的是Excel的标题,与数据是一对一的关系。先不管这么多,看下我们的模板,如下图所示。我们应该能够发现,省份拼音、省份名、城市名,还有ProvinceCityInfoExcel.xls,Sheet1都被笔者标识了,当然 这一步与数据库中的存储过程取出的数据也是一对一的。( 名称一致,可以减少很多不必要的麻烦,不然的话,嘿嘿....自己去想,那不是哥的事)
 
等下,需要将创建的EXCEL模板放置到我们的项目文件目录中。 (详见第七步)
 
(六)SSIS操作过程(生成Package,用来调用)
这一步是最主要的过程,当然,也是很容易出错的一步。 笔者会另外详细介绍制作Package包的过程,本文将直接将生成的包放到VS项目中进行运用。
利用SQL Server 2005数据库自带的SQL Server Business Intelligence Development Studio(SQL Server商业智能开发平台),最终生成的项目如下图所示:
然后, 将在SSIS项目中生成的Package.dtsx包复制到自己的项目文件目录中。这就是我们马上进入的步骤了---->(步骤七)
 
(七)C#中调用SSIS创建的Package和Excel模板(可以自己编写逻辑代码进行重复利用),用来生成Excel数据
先看下我们的VS2008项目,如下图所示:
 
大家会发现,笔者 将(五)(六)步骤生成的模板和Package包放置在项目中的“Excel导出”目录下,当然这些文件随便你放在哪里,这是不用再废话的,哈哈。
另外,笔者简单的设计了如下很粗糙的界面,目的是根据省份来显示城市的相关信息(其实大家都是很熟悉这些的,很多项目都是有省-市-县数据库表的),添加一个导出按钮,点击的时候,我们可以 参考页面显示的内容和我们生成的客户端Excel中的内容是否一致。
 
现在我们的重头戏开始了,如下代码(点击将触发的代码内容):
复制代码
复制代码
1  protected void  btnSSISSearch_Click( object  sender, EventArgs e)
2  {
3  // 构造sql语句 作为参数传递给数据包
4  string  sqlParams  =  Jasen.SSIS.Core.SsisToExcel.BuildSql( " dbo.ProvinceSelectedCityInfo " " @provinceId " , int .Parse(ddlProvice.SelectedValue));
5  Jasen.SSIS.Core.SsisToExcel ssis  = new  Jasen.SSIS.Core.SsisToExcel();
6  string  rootPath  =  Request.PhysicalApplicationPath;
7  string  copyFilePath;
8  // 执行SSIS包的操作 生成EXCEL文件
9  bool  result  =  ssis.ExportDataBySsis(rootPath, sqlParams,  out  copyFilePath,  " Package.dtsx " , " ProviceCityInfoExcel.xls " " ProviceCityInfo " );
10  if  (result  == false ){
11  if  (System.IO.File.Exists(copyFilePath)) System.IO.File.Delete(copyFilePath); 
12  }
13  else
14  {
15  ssis.DownloadFile( this " ProviceCityInfoClientFile.xls " , copyFilePath,  true );
16  }
17  }
复制代码
复制代码

 

你肯定会说:“哥,你这个也太简单了吧?”。就是这么简单,不就是多写一个类给你调用就可以了吗。调用接口,这个你总会吧。不过你得了解各个参数才行。

首先,我们必须引用2个DLL,Microsoft.SQLServer.ManagedDTS.dll和Microsoft.SqlServer.DTSPipelineWrap.dll(系统自带的)。先看下我们生成Excel文件数据的步骤,如下:

复制代码
复制代码
/// <summary>
///  导出数据到EXCEL文件中
/// </summary>
/// <param name="rootPath"></param>
/// <param name="sqlParams"> 执行包的传入参数 </param>
/// <param name="copyFile"> 生成的Excel的文件 </param>
/// <param name="packageName"> SSIS包名称 </param>
/// <param name="execlFileName"> SSIS EXCEL模板名称 </param>
/// <param name="createdExeclPreName"> 生成的Excel的文件前缀 </param>
/// <returns></returns>
public bool  ExportDataBySsis( string  rootPath,  string  sqlParams,  out string  tempExcelName,  string  packageName,  string execlFileName,  string  createdExeclPreName)
{
// 数据包和EXCEL模板的存储路径
string  path  =  rootPath  + @" Excel导出\ " ;
// 强制生成目录
if  ( ! System.IO.Directory.Exists(path)) System.IO.Directory.CreateDirectory(path);
// 返回生成的文件名
string  copyFile  = this .SaveAndCopyExcel(path, execlFileName, createdExeclPreName);
tempExcelName 
=  copyFile;
// SSIS包路径
string  ssisFileName  =  path  +  packageName;
// 执行---把数据导入到Excel文件
return  ExecuteSsisDataToFile(ssisFileName, tempExcelName, sqlParams);
}
复制代码
复制代码

 

 

代码注释如此清楚,想必也不需要再多做解释了吧,下面就是最最最重要的一步,需要看清楚了----->

复制代码
复制代码
1  private bool  ExecuteSsisDataToFile( string  ssisFileName,  string  tempExcelName,  string  sqlParams)
2  {
3  Application app  = new  Application();
4  Package package  = new  Package();
5  // 加载SSIS包 
6  package  =  app.LoadPackage(ssisFileName,  null );
7  // 获取 数据库连接字符串
8  package.Connections[ " AdoConnection " ].ConnectionString  =  Jasen.SSIS.Common.SystemConst.ConnectionString;
9  // 目标Excel属性
10  string  excelDest  = string .Format( " Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties=\ " EXCEL 8.0 ;HDR = YES\ " ; " , tempExcelName);
11  package.Connections[ " ExcelConnection " ].ConnectionString  =  excelDest;
12  // 给参数传值
13  Variables vars  =  package.Variables;
14  string  str  = vars[ " 用户::SqlStr " ].Value .ToString();
15  vars[ " 用户::SqlStr " ].Value  =  sqlParams;
16  // 执行
17  DTSExecResult result  =  package.Execute();
18  if  (result  ==  DTSExecResult.Success){
19  return true ;
20  }
21  else {
22  if  (package.Errors.Count  > 0 ){
23  // 在log中写出错误列表
24  StringBuilder sb = new  StringBuilder();
25  for  ( int  i  = 0 ; i  <  package.Errors.Count; i ++ ){
26  sb.Append( " Package error: " +  package.Errors[i].Description  + " ; " );
27  }
28  throw new  Exception(sb.ToString());
29  }
30  else {
31  throw new  Exception( " SSIS Unknow error " );
32  }
33  return false ;
34  }
35  }
复制代码
复制代码

 

上面标注为红色的就是最重要的几个步骤了,相对来说,就是(1)加载包,(2)设置包的数据库连接串,(3)设置Excel的连接串,(4)设置参数变量,(5)执行操作

其次是如何巧妙的将Excel模板复制,使模板可以重复利用(当然也要注意将生成的文件下载到客户端后,将服务器上生成的Excel临时文件删除,你也可以写自己的算法进行清理不必要的Excel临时文件),如下代码所示,方法将复制模板,然后返回生成的临时文件的路径,如果需要删除该文件,System.IO.File.Delete(filePath)就可以删除文件了:

 
讲了这么多,来看下我们点击后生成的效果,
 
开始有点效果了,Excel终于可以下载到客户端了,我们保存该文件。我们是不是想核实一下,我们采用的SSIS方法来实现Excel数据导入是不是正确的,会不会生成错误的数据?
那我们看下下面的一张图,将它与上面的一张图比较一下,看下数据是不是一样的:
 
发现生成的数据是一模一样的。我们是将数据导入到服务器上的临时EXCEL文件中,将文件发送到客户端肯定是不会出错的,除了你RP太差以外。RP差,任何事情都可能发生,嘿嘿。
 
(八)总结
在上面的示例中,由于数据量不是太多,你还感觉不到该方法的优势(效率高)。但是当数据量很大的时候,你用其他方法还在那里慢慢地等待excel文件生成的时候,该方法早就已经将数据导入到Excel中,并且发送到客户端了。有时候时间相差几十秒也是有可能的。数据量越大,效果越明显.....
接下来笔者将在另外一篇随笔中详细讲解SSIS package包的制作过程。这篇主要是SSIS应用篇。
希望各位能够在本随笔中有所收获。一口气写下来,还真不容易,写文章确实挺锻炼人的。当然,本文中肯定还有很多不足之处,希望各位多多指教。
 
本文源代码附上VS2008项目: Jasen.SSISProject.rar[VS2008精简版SSIS应用源代码]
分类:  SQL
本文转自左正博客园博客,原文链接:http://www.cnblogs.com/soundcode/archive/2012/09/19/2693738.html ,如需转载请自行联系原作者
相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS&nbsp;SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/sqlserver
相关文章
|
17天前
|
关系型数据库 MySQL 数据库
数据库数据恢复—MYSQL数据库文件损坏的数据恢复案例
mysql数据库文件ibdata1、MYI、MYD损坏。 故障表现:1、数据库无法进行查询等操作;2、使用mysqlcheck和myisamchk无法修复数据库。
|
21天前
|
SQL 关系型数据库 MySQL
MySQL导入.sql文件后数据库乱码问题
本文分析了导入.sql文件后数据库备注出现乱码的原因,包括字符集不匹配、备注内容编码问题及MySQL版本或配置问题,并提供了详细的解决步骤,如检查和统一字符集设置、修改客户端连接方式、检查MySQL配置等,确保导入过程顺利。
|
29天前
|
Oracle 关系型数据库 数据库
Oracle数据恢复—Oracle数据库文件有坏快损坏的数据恢复案例
一台Oracle数据库打开报错,报错信息: “system01.dbf需要更多的恢复来保持一致性,数据库无法打开”。管理员联系我们数据恢复中心寻求帮助,并提供了Oracle_Home目录的所有文件。用户方要求恢复zxfg用户下的数据。 由于数据库没有备份,无法通过备份去恢复数据库。
|
2月前
|
存储 关系型数据库 MySQL
PACS系统 中 dicom 文件在mysql 8.0 数据库中的 存储和读取(pydicom 库使用)
PACS系统 中 dicom 文件在mysql 8.0 数据库中的 存储和读取(pydicom 库使用)
45 2
|
1月前
|
Java easyexcel 大数据
震撼!通过双重异步,Excel 10万行数据导入从191秒优化到2秒!
通过合理设计线程池和利用异步编程模型,本文展示了如何将 Excel 10万行数据的导入时间从191秒优化到2秒。文章详细介绍了使用 Spring Boot 的 `@Async` 注解、自定义线程池和 EasyExcel 进行大数据量的 Excel 解析和异步写入数据库的方法。通过分而治之的策略,减少了系统的响应时间,提高了并发处理能力。同时,还分析了如何根据 CPU 和 IO 密集型任务的特性,合理设置线程池的参数,以充分发挥硬件资源的性能。
|
2月前
|
Oracle 关系型数据库 数据库
oracle数据恢复—Oracle数据库文件损坏导致数据库打不开的数据恢复案例
打开oracle数据库时报错,报错信息:“system01.dbf需要更多的恢复来保持一致性,数据库无法打开”。急需恢复zxfg用户下的数据。 出现上述报错的原因有:控制文件损坏、数据文件损坏、数据文件与控制文件的SCN不一致等。数据恢复工程师对数据库文件做进一步检测分析后发现sysaux01.dbf文件有坏块。修复sysaux01.dbf文件,启动数据库依然有许多查询报错。export和data pump工具无法使用,查询告警日志并分析报错,确认发生上述错误的原因就是sysaux01.dbf文件损坏。由于该文件损坏,从数据库层面无法修复数据库。由于system和用户表空间的数据文件是正常的,
|
1月前
|
C# 开发者
C# 一分钟浅谈:Code Contracts 与契约编程
【10月更文挑战第26天】本文介绍了 C# 中的 Code Contracts,这是一个强大的工具,用于通过契约编程增强代码的健壮性和可维护性。文章从基本概念入手,详细讲解了前置条件、后置条件和对象不变量的使用方法,并通过具体代码示例进行了说明。同时,文章还探讨了常见的问题和易错点,如忘记启用静态检查、过度依赖契约和性能影响,并提供了相应的解决建议。希望读者能通过本文更好地理解和应用 Code Contracts。
37 3
|
5天前
|
存储 安全 编译器
学懂C#编程:属性(Property)的概念定义及使用详解
通过深入理解和使用C#的属性,可以编写更清晰、简洁和高效的代码,为开发高质量的应用程序奠定基础。
37 12
|
1月前
|
设计模式 C# 图形学
Unity 游戏引擎 C# 编程:一分钟浅谈
本文介绍了在 Unity 游戏开发中使用 C# 的基础知识和常见问题。从 `MonoBehavior` 类的基础用法,到变量和属性的管理,再到空引用异常、资源管理和性能优化等常见问题的解决方法。文章还探讨了单例模式、事件系统和数据持久化等高级话题,旨在帮助开发者避免常见错误,提升游戏开发效率。
52 4
|
3月前
|
API C#
C# 一分钟浅谈:文件系统编程
在软件开发中,文件系统操作至关重要。本文将带你快速掌握C#中文件系统编程的基础知识,涵盖基本概念、常见问题及解决方法。文章详细介绍了`System.IO`命名空间下的关键类库,并通过示例代码展示了路径处理、异常处理、并发访问等技巧,还提供了异步API和流压缩等高级技巧,帮助你写出更健壮的代码。
53 2