转载自  http://blog.csdn.net/mazhaojuan/article/details/8598368

前面已经介绍过如何向数据库的一张表中批量导入数据,详情见博客《项目经验---简单三层使用DataTable向数据库表批量导入数据---向SqlServer一张表中导入数据》;本文主要介绍如何向SqlServer的多张表中批量导入数据。

如今有这样一个需求,需要批量导入建筑信息,依据数据库表结构设计,批量导入建筑信息,需要向数据库相应的三张表都写入数据。

看一下数据库表结构设计:

在建筑表(TB_Building)中,BuildingID是主键,在建筑类型表(TB_BuildingType)中BuildingTypeID是主键,建筑表与建筑类型之间的关系通过第三张表(建筑类型关系表《TBR_BuildingTypeLink》)来维护,建筑与建筑类型关系表保证了数据的唯一性!   导入建筑信息,需要同时导入建筑与建筑类型的关系,还需要导入建筑与校区的关系(哪一个校区的建筑)。

下面借助《批量导入建筑信息》的实例讲解批量向数据库多张表导入数据的方法。

1.界面设计

观看一下批量导入建筑信息的界面设计:

2.框架结构

此项目的实现,我依然采用简单的三层,看一下项目框架

3.批量向数据库多张表导入数据的实现

下面逐层介绍向数据库导入数据各层的代码实现:

 3.1 SqlHelper数据库助手类中添加向数据库表导入数据的方法(SqlHelper.cs)

[csharp] view plain copy print?
  1. <span style="font-family: KaiTi_GB2312; font-size: 18px;">#region 批量导入DataTable
  2. /// <summary>批量导入DataTable
  3. /// 批量导入DataTable
  4. /// </summary>
  5. /// <param name="dt">DataTable数据表</param>
  6. /// <param name="tableName">表名</param>
  7. /// <param name="dtColum">数据列集合</param>
  8. /// <return>Boolean值:true成功,false失败</return>
  9. public Boolean InsertTable(DataTable dt, string tableName, DataColumnCollection dtColum)
  10. {
  11. //打开数据库
  12. GetConn();
  13. try
  14. {
  15. //声明SqlBulkCopy ,using释放非托管资源
  16. using (SqlBulkCopy sqlBC = new SqlBulkCopy(sqlConn))
  17. {
  18. //一次批量的插入的数据量
  19. sqlBC.BatchSize = 1000;
  20. //超时之前操作完成所允许的秒数,如果超时则事务不会提交 ,数据将回滚,所有已复制的行都会从目标表中移除
  21. sqlBC.BulkCopyTimeout = 60;
  22. //設定 NotifyAfter 属性,以便在每插入10000 条数据时,呼叫相应事件。
  23. //sqlBC.NotifyAfter = 10000;
  24. // sqlBC.SqlRowsCopied += new SqlRowsCopiedEventHandler(OnSqlRowsCopied);
  25. //设置要批量写入的表
  26. sqlBC.DestinationTableName = tableName;
  27. //自定义的datatable和数据库的字段进行对应
  28. //sqlBC.ColumnMappings.Add("id", "tel");
  29. //sqlBC.ColumnMappings.Add("name", "neirong");
  30. for (int i = 0; i < dtColum.Count; i++)
  31. {
  32. sqlBC.ColumnMappings.Add(dtColum[i].ColumnName.ToString(), dtColum[i].ColumnName.ToString());
  33. }
  34. //批量写入
  35. sqlBC.WriteToServer(dt);
  36. }
  37. //  conn.Dispose();
  38. //GetConn();
  39. return true;
  40. }
  41. catch
  42. {
  43. return false;
  44. }
  45. finally
  46. {
  47. //关闭数据库
  48. sqlConn.Close();
  49. }
  50. }
  51. #endregion</span>

 #region 批量导入DataTable/// <summary>批量导入DataTable/// 批量导入DataTable/// </summary>/// <param name="dt">DataTable数据表</param>/// <param name="tableName">表名</param>/// <param name="dtColum">数据列集合</param>/// <return>Boolean值:true成功,false失败</return>public Boolean InsertTable(DataTable dt, string tableName, DataColumnCollection dtColum){//打开数据库GetConn();try{//声明SqlBulkCopy ,using释放非托管资源using (SqlBulkCopy sqlBC = new SqlBulkCopy(sqlConn)){//一次批量的插入的数据量sqlBC.BatchSize = 1000;//超时之前操作完成所允许的秒数,如果超时则事务不会提交 ,数据将回滚,所有已复制的行都会从目标表中移除sqlBC.BulkCopyTimeout = 60;//設定 NotifyAfter 属性,以便在每插入10000 条数据时,呼叫相应事件。 //sqlBC.NotifyAfter = 10000;// sqlBC.SqlRowsCopied += new SqlRowsCopiedEventHandler(OnSqlRowsCopied);//设置要批量写入的表sqlBC.DestinationTableName = tableName;//自定义的datatable和数据库的字段进行对应//sqlBC.ColumnMappings.Add("id", "tel");//sqlBC.ColumnMappings.Add("name", "neirong");for (int i = 0; i < dtColum.Count; i++){sqlBC.ColumnMappings.Add(dtColum[i].ColumnName.ToString(), dtColum[i].ColumnName.ToString());}//批量写入sqlBC.WriteToServer(dt);}//  conn.Dispose();//GetConn();return true;}catch{return false;}finally{//关闭数据库sqlConn.Close();}}#endregion

3.2 DAL层批量导入数据的代码(BuildingDAL.cs)

[csharp] view plain copy print?
  1. #region 批量添加建筑信息
  2. /// <summary>
  3. /// 建筑管理:批量添加建筑信息:
  4. /// 1.向建筑表添加建筑基本信息
  5. /// 2.向建筑与建筑类型关联表添加建筑与建筑类型的关联信息
  6. /// 3.向建筑与校区关联表添加建筑与校区的关联信息
  7. /// </summary>
  8. /// <summary>
  9. /// 批量导入建筑信息
  10. /// </summary>
  11. /// <param name="ds">DataSet-ds;</param>
  12. public Boolean ImportBuilding(DataSet ds)
  13. {
  14. //定义布尔型标记变量,记录建筑是否添加成功
  15. //添加建筑信息
  16. Boolean flagAddBuilding;
  17. //添加建筑与建筑类型的关系
  18. Boolean flagAddBuildingType;
  19. //添加建筑与校区的关系
  20. Boolean flagAddBuildingCampus;
  21. //执行隐式事务:报错--此操作对该状态的事务无效 的错误于是去掉了事务
  22. //using (TransactionScope scope = new TransactionScope())
  23. //{
  24. //调用sqlHelper的"批量导入datatable表"的方法
  25. flagAddBuilding = sqlHelper.InsertTable(ds.Tables["dt_AddBuilding"], "TB_Building", ds.Tables["dt_AddBuilding"].Columns);
  26. //调用sqlHelper的"批量导入datatable表"的方法
  27. flagAddBuildingType = sqlHelper.InsertTable(ds.Tables["dt_AddBuildingType"], "TBR_BuildingTypeLink", ds.Tables["dt_AddBuildingType"].Columns);
  28. //调用sqlHelper的"批量导入datatable表"的方法
  29. flagAddBuildingCampus = sqlHelper.InsertTable(ds.Tables["dt_AddBuildingCampus"], "TBR_BuildingCampusLink", ds.Tables["dt_AddBuildingCampus"].Columns);
  30. //}
  31. //返回结果
  32. return (flagAddBuilding && flagAddBuildingType && flagAddBuildingCampus);
  33. }
  34. #endregion

 #region 批量添加建筑信息/// <summary>/// 建筑管理:批量添加建筑信息:/// 1.向建筑表添加建筑基本信息 /// 2.向建筑与建筑类型关联表添加建筑与建筑类型的关联信息 /// 3.向建筑与校区关联表添加建筑与校区的关联信息/// </summary>/// <summary>/// 批量导入建筑信息/// </summary>/// <param name="ds">DataSet-ds;</param>public Boolean ImportBuilding(DataSet ds){//定义布尔型标记变量,记录建筑是否添加成功//添加建筑信息Boolean flagAddBuilding;//添加建筑与建筑类型的关系Boolean flagAddBuildingType;//添加建筑与校区的关系Boolean flagAddBuildingCampus;//执行隐式事务:报错--此操作对该状态的事务无效 的错误于是去掉了事务//using (TransactionScope scope = new TransactionScope())//{//调用sqlHelper的"批量导入datatable表"的方法flagAddBuilding = sqlHelper.InsertTable(ds.Tables["dt_AddBuilding"], "TB_Building", ds.Tables["dt_AddBuilding"].Columns);//调用sqlHelper的"批量导入datatable表"的方法flagAddBuildingType = sqlHelper.InsertTable(ds.Tables["dt_AddBuildingType"], "TBR_BuildingTypeLink", ds.Tables["dt_AddBuildingType"].Columns);//调用sqlHelper的"批量导入datatable表"的方法flagAddBuildingCampus = sqlHelper.InsertTable(ds.Tables["dt_AddBuildingCampus"], "TBR_BuildingCampusLink", ds.Tables["dt_AddBuildingCampus"].Columns);//}//返回结果return (flagAddBuilding && flagAddBuildingType && flagAddBuildingCampus);}#endregion

3.3 BLL层批量导入数据的代码(BuildingBLL.cs)

[csharp] view plain copy print?
  1. #region 批量导入建筑信息
  2. /// <summary>
  3. /// 批量导入建筑信息
  4. /// </summary>
  5. /// <param name="ds">DataSet</param>
  6. /// <returns>是否导入成功:true成功,false失败</returns>
  7. public Boolean ImportBuiding(DataSet ds)
  8. {
  9. return buildingDAL.ImportBuilding(ds);
  10. }
  11. #endregion

#region 批量导入建筑信息/// <summary>/// 批量导入建筑信息/// </summary>/// <param name="ds">DataSet</param>/// <returns>是否导入成功:true成功,false失败</returns>public Boolean ImportBuiding(DataSet ds){return buildingDAL.ImportBuilding(ds);}#endregion

3.4 界面层构造DataSet数据,向BLL层传递

这里我依然采用从界面上传Excel,然后从Excel获取输入然后存入DataSet的各DataTable表中。

3.4.1 界面层HTML代码(AddBuilding.aspx)

[html] view plain copy print?
  1. <div class="block">
  2. <div class="h">
  3. <span class="icon-sprite icon-list"></span>
  4. <h3>批量导入建筑</h3>
  5. <div class="bar">
  6. <a class="btn-lit" href="javascript:history.go('<% =returnCount %>')"><span>返回</span></a>
  7. </div>
  8. </div>
  9. <div class="tl corner"></div>
  10. <div class="tr corner"></div>
  11. <div class="bl corner"></div>
  12. <div class="br corner"></div>
  13. <div class="cnt-wp">
  14. <div class="cnt form">
  15. <%--<form method="post" enctype="multipart/form-data" action="">--%>
  16. <table class="data-form" cellspacing="0" cellpadding="0">
  17. <tr><td>
  18. <asp:Label ID="Label1" runat="server" Text="提示:请导入扩展名为.xls的文件【工作薄名:Sheet1;表头(如下):】"></asp:Label>
  19. </td>
  20. </tr>
  21. <tr><td>
  22. <img src="../uploadFileImage/importBuilding.jpg"  alt=""/></td>
  23. </tr>
  24. <tr>
  25. <asp:FileUpload ID="fupImportBuilding" runat="server" />
  26. <asp:Button ID="btnImportBuilding" runat="server" Text="批量导入" OnClick="btnImportBuilding_Click" />
  27. </tr>
  28. </table>
  29. <%-- </form>--%>
  30. </div>
  31. </div>
  32. </div>

<div class="block"><div class="h"><span class="icon-sprite icon-list"></span><h3>批量导入建筑</h3><div class="bar"><a class="btn-lit" href="javascript:history.go('<% =returnCount %>')"><span>返回</span></a></div></div><div class="tl corner"></div><div class="tr corner"></div><div class="bl corner"></div><div class="br corner"></div><div class="cnt-wp"><div class="cnt form"><%--<form method="post" enctype="multipart/form-data" action="">--%><table class="data-form" cellspacing="0" cellpadding="0"><tr><td><asp:Label ID="Label1" runat="server" Text="提示:请导入扩展名为.xls的文件【工作薄名:Sheet1;表头(如下):】"></asp:Label></td></tr><tr><td><img src="../uploadFileImage/importBuilding.jpg"  alt=""/></td></tr> <tr><asp:FileUpload ID="fupImportBuilding" runat="server" /><asp:Button ID="btnImportBuilding" runat="server" Text="批量导入" OnClick="btnImportBuilding_Click" />                   </tr></table><%-- </form>--%></div></div></div>

3.4.2 从界面传入Excel,调用BLL层Excel转换成DataTable的方法(AddBuilding.aspx.cs)

[csharp] view plain copy print?
  1. #region 批量导入建筑信息
  2. protected void btnImportBuilding_Click(object sender,EventArgs e) {
  3. //建筑业务逻辑层
  4. BuildingBLL buildingBLL = new BuildingBLL();
  5. //BLL层把Excel转化为datatable类
  6. CreateExcelDataBLL createExcelData = new CreateExcelDataBLL();
  7. //获取上传文件地址
  8. string url = fupImportBuilding.PostedFile.FileName.ToString();
  9. if (url == "")
  10. {
  11. //数据源为空,弹出提示:请选择Excel文件!
  12. Page.ClientScript.RegisterStartupScript(Page.GetType(), "message", "<script language='javascript' defer>alert('请选择Excel文件!');</script>");
  13. return;
  14. }
  15. string urlLocation = url.Substring(url.LastIndexOf("\\") + 1);//获取文件名
  16. DataTable dtAllBuildingCampusType;
  17. //在系统中建文件夹up,并将excel文件另存
  18. this.fupImportBuilding.SaveAs(Server.MapPath("~\\UploadFile") + "\\" + urlLocation);//记录文件名到服务器相对应的文件夹中
  19. //获得文件路径
  20. string strpath = Server.MapPath("~\\UploadFile") + "\\" + urlLocation;
  21. //把上传的Excel转换为datatable
  22. dtAllBuildingCampusType = createExcelData.CreateExcelDataSource(strpath);
  23. DataSet dsBuildingCampusType = new DataSet("ds_BuilingCampusType"); //创建一个名为ds_BuilingCampusType的DataSet
  24. //手动创建的新数据表-建筑数据表
  25. DataTable dtAddBuilding = new DataTable("dt_AddBuilding"); //创建一个名为dt_AddBuilding的DataTalbe
  26. //为dt_AddBuilding表内建立Column(表头),添加数据列:建筑ID、建筑代码、建筑名、是否可用、备注、操作类型、操作内容、操作原因、操作人、操作时间
  27. dtAddBuilding.Columns.Add(new DataColumn("BuildingID", typeof(string)));
  28. dtAddBuilding.Columns.Add(new DataColumn("BuildingCode", typeof(string)));
  29. dtAddBuilding.Columns.Add(new DataColumn("BuildingName", typeof(string)));
  30. dtAddBuilding.Columns.Add(new DataColumn("IsAvailable", typeof(string)));
  31. dtAddBuilding.Columns.Add(new DataColumn("Descriptions",typeof(string)));
  32. dtAddBuilding.Columns.Add(new DataColumn("ActionType", typeof(string)));
  33. dtAddBuilding.Columns.Add(new DataColumn("ActionContent", typeof(string)));
  34. dtAddBuilding.Columns.Add(new DataColumn("ActionReason", typeof(string)));
  35. dtAddBuilding.Columns.Add(new DataColumn("Operator", typeof(string)));
  36. dtAddBuilding.Columns.Add(new DataColumn("SetDatetime", typeof(DateTime)));
  37. //手动创建的新数据表-建筑、建筑类型关系数据表
  38. DataTable dtAddBuildingType = new DataTable("dt_AddBuildingType"); //创建一个名为dt_AddBuildingType的DataTalbe
  39. //为dt_AddBuildingType表内建立Column(表头),添加数据列:建筑ID、建筑类型ID、是否可用
  40. dtAddBuildingType.Columns.Add(new DataColumn("BuildingID", typeof(string)));
  41. dtAddBuildingType.Columns.Add(new DataColumn("BuildingTypeID", typeof(string)));
  42. dtAddBuildingType.Columns.Add(new DataColumn("IsAvailable", typeof(string)));
  43. //手动创建的新数据表-建筑、校区关系数据表
  44. DataTable dtAddBuildingCampus = new DataTable("dt_AddBuildingCampus"); //创建一个名为dt_AddBuildingCampus的DataTalbe
  45. //为dt_AddBuildingCampus表内建立Column(表头),添加数据列:建筑ID、校区ID、是否可用
  46. dtAddBuildingCampus.Columns.Add(new DataColumn("BuildingID", typeof(string)));
  47. dtAddBuildingCampus.Columns.Add(new DataColumn("CampusID", typeof(string)));
  48. dtAddBuildingCampus.Columns.Add(new DataColumn("IsAvailable", typeof(string)));
  49. //从上传的Excel转换为的datatable表中取出数据,分别放入建筑信息表、建筑与建筑类型关系表、建筑与校区关系表
  50. for (int intRow = 0; intRow < dtAllBuildingCampusType.Rows.Count; intRow++)
  51. {
  52. //建筑ID
  53. string strBuildingID = Guid.NewGuid().ToString();
  54. //建筑代码
  55. string strBuildingCode= dtAllBuildingCampusType.Rows[intRow]["建筑代码"].ToString();
  56. //建筑名
  57. string strBuildingName = dtAllBuildingCampusType.Rows[intRow]["建筑名"].ToString();
  58. //建筑备注
  59. string strBuildingDescription=dtAllBuildingCampusType.Rows[intRow]["备注"].ToString();
  60. //建筑类型代码
  61. string strBuildingTypeCode = dtAllBuildingCampusType.Rows[intRow]["建筑类型代码"].ToString();
  62. //校区代码
  63. string strCampusCode=dtAllBuildingCampusType.Rows[intRow]["校区代码"].ToString();
  64. //根据建筑类型代码获取建筑类型ID
  65. BuildingTypeEntity enBuildingType = new BuildingTypeEntity();
  66. //建筑类型代码
  67. enBuildingType.BuildingTypeCode = strBuildingTypeCode;
  68. //建筑业务逻辑层,按建筑类型代码查询建筑类型ID
  69. DataTable dtBuildingType = new BuildingBLL().QueryBuildingTypeByCode(enBuildingType);
  70. //建筑类型ID为
  71. string strBuildingTypeID = dtBuildingType.Rows[0]["BuildingTypeID"].ToString();
  72. //根据校区代码获取校区ID
  73. CampusEntity enCampus = new CampusEntity();
  74. //校区代码
  75. enCampus.CampusCode = strCampusCode;
  76. //建筑业务逻辑层,按校区代码查询校区ID
  77. DataTable dtCampus = new BuildingBLL().QueryCampusByCode(enCampus);
  78. //校区ID
  79. string strCampusID=dtCampus.Rows[0]["CampusID"].ToString();
  80. //添加建筑信息表的新行
  81. DataRow drAddBuilding = dtAddBuilding.NewRow();//注意这边创建dt的新行的方法。指定类型是DataRow而不是TableRow,然后不用new直接的用创建的DataTable下面的NewRow方法。
  82. //建筑信息表对应的各列值
  83. drAddBuilding["BuildingID"]=strBuildingID;
  84. drAddBuilding["BuildingCode"] = strBuildingCode;
  85. drAddBuilding["BuildingName"] = strBuildingName;
  86. drAddBuilding["IsAvailable"] = "是";
  87. drAddBuilding["Descriptions"] = strBuildingDescription;
  88. drAddBuilding["ActionType"] = null;
  89. drAddBuilding["ActionContent"] = null;
  90. drAddBuilding["ActionReason"] = null;
  91. drAddBuilding["Operator"] = null;
  92. drAddBuilding["SetDatetime"] = DateTime.Now; //当前日期时间
  93. dtAddBuilding.Rows.Add(drAddBuilding);  //将一整条数据写入表中
  94. //添加建筑与建筑类型关系信息表的新行
  95. DataRow drAddBuildingType = dtAddBuildingType.NewRow();
  96. //建筑与建筑类型关系信息表对应的各列值
  97. drAddBuildingType["BuildingID"] = strBuildingID;
  98. drAddBuildingType["BuildingTypeID"] = strBuildingTypeID;
  99. drAddBuildingType["IsAvailable"] = "是";
  100. dtAddBuildingType.Rows.Add(drAddBuildingType); //将一整条数据写入表中
  101. //添加建筑与校区关系信息表的新行
  102. DataRow drAddBuildingCampus = dtAddBuildingCampus.NewRow();
  103. //建筑与校区关系信息表对应的各列值
  104. drAddBuildingCampus["BuildingID"] = strBuildingID;
  105. drAddBuildingCampus["CampusID"] = strCampusID;
  106. drAddBuildingCampus["IsAvailable"] = "是";
  107. dtAddBuildingCampus.Rows.Add(drAddBuildingCampus); //将一整条数据写入表中
  108. }
  109. //将各表加入DataSet中:建筑信息、建筑与建筑类型关系信息、建筑与校区关系信息
  110. dsBuildingCampusType.Tables.Add(dtAddBuilding);
  111. dsBuildingCampusType.Tables.Add(dtAddBuildingType);
  112. dsBuildingCampusType.Tables.Add(dtAddBuildingCampus);
  113. //将DataSet中数据表导入数据库
  114. Boolean flagImportBuilding = buildingBLL.ImportBuiding(dsBuildingCampusType);
  115. if (true==flagImportBuilding)
  116. {
  117. //导入成功,弹出提示
  118. Page.ClientScript.RegisterStartupScript(Page.GetType(), "message", "<script language='javascript' defer>alert('建筑信息导入成功!');</script>");
  119. }
  120. else
  121. {
  122. //导入失败,弹出提示
  123. Page.ClientScript.RegisterStartupScript(Page.GetType(), "message", "<script language='javascript' defer>alert('建筑信息导入失败!');</script>");
  124. }
  125. }
  126. #endregion

 #region 批量导入建筑信息protected void btnImportBuilding_Click(object sender,EventArgs e) {//建筑业务逻辑层BuildingBLL buildingBLL = new BuildingBLL();//BLL层把Excel转化为datatable类CreateExcelDataBLL createExcelData = new CreateExcelDataBLL();//获取上传文件地址string url = fupImportBuilding.PostedFile.FileName.ToString();if (url == ""){//数据源为空,弹出提示:请选择Excel文件!Page.ClientScript.RegisterStartupScript(Page.GetType(), "message", "<script language='javascript' defer>alert('请选择Excel文件!');</script>");return;}string urlLocation = url.Substring(url.LastIndexOf("\\") + 1);//获取文件名DataTable dtAllBuildingCampusType;//在系统中建文件夹up,并将excel文件另存this.fupImportBuilding.SaveAs(Server.MapPath("~\\UploadFile") + "\\" + urlLocation);//记录文件名到服务器相对应的文件夹中//获得文件路径string strpath = Server.MapPath("~\\UploadFile") + "\\" + urlLocation;//把上传的Excel转换为datatabledtAllBuildingCampusType = createExcelData.CreateExcelDataSource(strpath);DataSet dsBuildingCampusType = new DataSet("ds_BuilingCampusType"); //创建一个名为ds_BuilingCampusType的DataSet//手动创建的新数据表-建筑数据表DataTable dtAddBuilding = new DataTable("dt_AddBuilding"); //创建一个名为dt_AddBuilding的DataTalbe//为dt_AddBuilding表内建立Column(表头),添加数据列:建筑ID、建筑代码、建筑名、是否可用、备注、操作类型、操作内容、操作原因、操作人、操作时间dtAddBuilding.Columns.Add(new DataColumn("BuildingID", typeof(string)));dtAddBuilding.Columns.Add(new DataColumn("BuildingCode", typeof(string)));dtAddBuilding.Columns.Add(new DataColumn("BuildingName", typeof(string)));dtAddBuilding.Columns.Add(new DataColumn("IsAvailable", typeof(string)));dtAddBuilding.Columns.Add(new DataColumn("Descriptions",typeof(string)));dtAddBuilding.Columns.Add(new DataColumn("ActionType", typeof(string)));dtAddBuilding.Columns.Add(new DataColumn("ActionContent", typeof(string)));dtAddBuilding.Columns.Add(new DataColumn("ActionReason", typeof(string)));dtAddBuilding.Columns.Add(new DataColumn("Operator", typeof(string)));dtAddBuilding.Columns.Add(new DataColumn("SetDatetime", typeof(DateTime)));//手动创建的新数据表-建筑、建筑类型关系数据表DataTable dtAddBuildingType = new DataTable("dt_AddBuildingType"); //创建一个名为dt_AddBuildingType的DataTalbe//为dt_AddBuildingType表内建立Column(表头),添加数据列:建筑ID、建筑类型ID、是否可用dtAddBuildingType.Columns.Add(new DataColumn("BuildingID", typeof(string)));dtAddBuildingType.Columns.Add(new DataColumn("BuildingTypeID", typeof(string)));dtAddBuildingType.Columns.Add(new DataColumn("IsAvailable", typeof(string)));//手动创建的新数据表-建筑、校区关系数据表DataTable dtAddBuildingCampus = new DataTable("dt_AddBuildingCampus"); //创建一个名为dt_AddBuildingCampus的DataTalbe//为dt_AddBuildingCampus表内建立Column(表头),添加数据列:建筑ID、校区ID、是否可用dtAddBuildingCampus.Columns.Add(new DataColumn("BuildingID", typeof(string)));dtAddBuildingCampus.Columns.Add(new DataColumn("CampusID", typeof(string)));dtAddBuildingCampus.Columns.Add(new DataColumn("IsAvailable", typeof(string)));//从上传的Excel转换为的datatable表中取出数据,分别放入建筑信息表、建筑与建筑类型关系表、建筑与校区关系表for (int intRow = 0; intRow < dtAllBuildingCampusType.Rows.Count; intRow++){//建筑IDstring strBuildingID = Guid.NewGuid().ToString();//建筑代码string strBuildingCode= dtAllBuildingCampusType.Rows[intRow]["建筑代码"].ToString();//建筑名string strBuildingName = dtAllBuildingCampusType.Rows[intRow]["建筑名"].ToString();  //建筑备注string strBuildingDescription=dtAllBuildingCampusType.Rows[intRow]["备注"].ToString();//建筑类型代码string strBuildingTypeCode = dtAllBuildingCampusType.Rows[intRow]["建筑类型代码"].ToString();//校区代码string strCampusCode=dtAllBuildingCampusType.Rows[intRow]["校区代码"].ToString();//根据建筑类型代码获取建筑类型IDBuildingTypeEntity enBuildingType = new BuildingTypeEntity();//建筑类型代码enBuildingType.BuildingTypeCode = strBuildingTypeCode;//建筑业务逻辑层,按建筑类型代码查询建筑类型IDDataTable dtBuildingType = new BuildingBLL().QueryBuildingTypeByCode(enBuildingType);//建筑类型ID为string strBuildingTypeID = dtBuildingType.Rows[0]["BuildingTypeID"].ToString();//根据校区代码获取校区IDCampusEntity enCampus = new CampusEntity();//校区代码enCampus.CampusCode = strCampusCode;//建筑业务逻辑层,按校区代码查询校区IDDataTable dtCampus = new BuildingBLL().QueryCampusByCode(enCampus);//校区IDstring strCampusID=dtCampus.Rows[0]["CampusID"].ToString();//添加建筑信息表的新行DataRow drAddBuilding = dtAddBuilding.NewRow();//注意这边创建dt的新行的方法。指定类型是DataRow而不是TableRow,然后不用new直接的用创建的DataTable下面的NewRow方法。//建筑信息表对应的各列值drAddBuilding["BuildingID"]=strBuildingID;drAddBuilding["BuildingCode"] = strBuildingCode;drAddBuilding["BuildingName"] = strBuildingName;drAddBuilding["IsAvailable"] = "是";drAddBuilding["Descriptions"] = strBuildingDescription;drAddBuilding["ActionType"] = null;drAddBuilding["ActionContent"] = null;drAddBuilding["ActionReason"] = null;drAddBuilding["Operator"] = null;drAddBuilding["SetDatetime"] = DateTime.Now; //当前日期时间dtAddBuilding.Rows.Add(drAddBuilding);  //将一整条数据写入表中//添加建筑与建筑类型关系信息表的新行DataRow drAddBuildingType = dtAddBuildingType.NewRow();//建筑与建筑类型关系信息表对应的各列值drAddBuildingType["BuildingID"] = strBuildingID;drAddBuildingType["BuildingTypeID"] = strBuildingTypeID;drAddBuildingType["IsAvailable"] = "是";dtAddBuildingType.Rows.Add(drAddBuildingType); //将一整条数据写入表中//添加建筑与校区关系信息表的新行DataRow drAddBuildingCampus = dtAddBuildingCampus.NewRow();//建筑与校区关系信息表对应的各列值drAddBuildingCampus["BuildingID"] = strBuildingID;drAddBuildingCampus["CampusID"] = strCampusID;drAddBuildingCampus["IsAvailable"] = "是";dtAddBuildingCampus.Rows.Add(drAddBuildingCampus); //将一整条数据写入表中}//将各表加入DataSet中:建筑信息、建筑与建筑类型关系信息、建筑与校区关系信息dsBuildingCampusType.Tables.Add(dtAddBuilding);dsBuildingCampusType.Tables.Add(dtAddBuildingType);dsBuildingCampusType.Tables.Add(dtAddBuildingCampus);//将DataSet中数据表导入数据库Boolean flagImportBuilding = buildingBLL.ImportBuiding(dsBuildingCampusType);if (true==flagImportBuilding){//导入成功,弹出提示Page.ClientScript.RegisterStartupScript(Page.GetType(), "message", "<script language='javascript' defer>alert('建筑信息导入成功!');</script>");}else{//导入失败,弹出提示Page.ClientScript.RegisterStartupScript(Page.GetType(), "message", "<script language='javascript' defer>alert('建筑信息导入失败!');</script>");}}#endregion

3.4.3 BLL层Excel转换成DataTable的类(MgrCreateExcelData.cs)

[csharp] view plain copy print?
  1. /*******************************************************************************
  2. *文    件:CreateExcelDataBLL.cs
  3. *作    者:mzj
  4. *所属小组:评教小组
  5. *文件说明:基础系统-把excel转化为datatable
  6. *创建日期:2013年1月23日9:43:16
  7. *修改作者:
  8. *修改日期:
  9. *修改描述:
  10. *版 本 号:V1.0
  11. *版本号变更记录:
  12. ********************************************************************************/
  13. using System;
  14. using System.Collections.Generic;
  15. using System.Linq;
  16. using System.Text;
  17. //引用各命名空间
  18. using System.Data;
  19. using System.Data.OleDb;
  20. using System.Data.SqlClient;
  21. using System.IO;
  22. namespace TeachSystem.BLL.CreateExcelDataBLL
  23. {
  24. public class CreateExcelDataBLL
  25. {
  26. //构造方法
  27. public CreateExcelDataBLL()
  28. {
  29. }
  30. /// <summary>
  31. /// 传入excel路径,转换为datatable
  32. /// </summary>
  33. /// <param name="url"></param>
  34. /// <returns></returns>
  35. public DataTable CreateExcelDataSource(string url)
  36. {
  37. //定义一个DataTable数据表
  38. DataTable dt = null;
  39. //获得excel数据
  40. string connetionStr = "Provider=Microsoft.Jet.OleDb.4.0;" + "data source=" + url + ";Extended Properties='Excel 8.0; HDR=YES; IMEX=1'";
  41. //从Excel表的Sheet1单元格获取数据
  42. string strSql = "select * from [Sheet1$]";
  43. OleDbConnection oleConn = new OleDbConnection(connetionStr);
  44. OleDbDataAdapter oleAdapter = new OleDbDataAdapter(strSql, connetionStr);
  45. try
  46. {
  47. //把Excel数据填充给DataTable
  48. dt = new DataTable();
  49. oleAdapter.Fill(dt);
  50. //返回数据表
  51. return dt;
  52. }
  53. catch (Exception ex)
  54. {
  55. throw ex;
  56. }
  57. finally
  58. {
  59. oleAdapter.Dispose();
  60. oleConn.Close();
  61. oleConn.Dispose();
  62. //删除上传的Excel文件(因为该文件的存在会占用多余的网站空间)
  63. if (File.Exists(url))
  64. {
  65. File.Delete(url);
  66. }
  67. }
  68. }
  69. }
  70. }

/********************************************************************************文    件:CreateExcelDataBLL.cs*作    者:mzj*所属小组:评教小组*文件说明:基础系统-把excel转化为datatable*创建日期:2013年1月23日9:43:16*修改作者:*修改日期:*修改描述:*版 本 号:V1.0*版本号变更记录:
********************************************************************************/using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;//引用各命名空间
using System.Data;
using System.Data.OleDb;
using System.Data.SqlClient;
using System.IO;namespace TeachSystem.BLL.CreateExcelDataBLL
{public class CreateExcelDataBLL{//构造方法public CreateExcelDataBLL(){}/// <summary>/// 传入excel路径,转换为datatable/// </summary>/// <param name="url"></param>/// <returns></returns>public DataTable CreateExcelDataSource(string url){//定义一个DataTable数据表DataTable dt = null;//获得excel数据string connetionStr = "Provider=Microsoft.Jet.OleDb.4.0;" + "data source=" + url + ";Extended Properties='Excel 8.0; HDR=YES; IMEX=1'";//从Excel表的Sheet1单元格获取数据string strSql = "select * from [Sheet1$]";OleDbConnection oleConn = new OleDbConnection(connetionStr);OleDbDataAdapter oleAdapter = new OleDbDataAdapter(strSql, connetionStr);try{//把Excel数据填充给DataTabledt = new DataTable();oleAdapter.Fill(dt);//返回数据表return dt;}catch (Exception ex){throw ex;}finally{oleAdapter.Dispose();oleConn.Close();oleConn.Dispose();//删除上传的Excel文件(因为该文件的存在会占用多余的网站空间)if (File.Exists(url)){File.Delete(url);}}}}
}

至此批量向数据库多张表导入数据的功能已完成了,对想数据库表导入的数据的合法性还需要自己通过代码进进行判断!

转载于:https://www.cnblogs.com/TJessica/p/6836073.html

批量向数据库多张表导入数据的实现相关推荐

  1. Postgres 数据库大批量单表导入数据引发性能故障的处理

    因公司经营管理策略原因,我们地区部门还是以开发外包和产品服务为主,对测试外包服务销售工作要求占比不高,而测试部门本来有四五个性能测试人员,加上老员工都比较积极做事在测试团队建设管理上不用花费太多精力. ...

  2. 使用C#语言在视图上新增数据库多张表的数据并返回到页面

    在新增数据时,如果需要同时向多张表里新增多条数据,这是我们就需要使用到 using(事务回调) 的方法,使用时需要对其进行引用. 1.using 事务 的引用 (1)鼠标右键点击引用,选择添加引用 ( ...

  3. Java对比两张Excel表的数据,java对比两个excel或者一张excel和数据库的一张表的数据是否相同,两张excel表格匹配相同的数据库...

    excel自动从数据库匹配相应的数据 vlookup函数:vlookup(lookup_value,table_array,col_index_num,[range_lookup]) 第一个:look ...

  4. 定时跑视图往另外一张表添加数据_聊一聊数据库中的锁

    背景 数据库中有一张叫后宫佳丽的表,每天都有几百万新的小姐姐插到表中,光阴荏苒,夜以继日,日久生情,时间长了,表中就有了几十亿的小姐姐数据,看到几十亿的小姐姐,每到晚上,我可愁死了,这么多小姐姐,我翻 ...

  5. python数据对比校验_Python对比数据库两张表是否一致

    工作中我们经常需要对比数据库中两张表的数据是否有差异,以下代码通过pymsql对两张表的数据进行简单对比,可以记录新旧表的数据总数,以及两张表中有差异的数据. 应用场景:旧表中数据迁移到新表 运行结果 ...

  6. plsql导出导入一张表的数据

    pl/sql导出一张表的数据: 在左边tables目录下右键点击对应的表->export data: 三种导出数据方式: 1.导出dmp格式,此方式可以导出clob字段. 1)选择执行的命令ex ...

  7. 关于跨DB增量(增、改)同步两张表的数据小技巧

    有些场景下,需要隔离不同的DB,彼此DB之间不能互相访问,但实际的业务场景又需要从A DB访问B DB的情形,这时怎么办?我认为有如下常规的三种方案: 1.双方提供RESET API,需要访问不同DB ...

  8. php sql 去除重复数据,MSSQL_快速删除重复记录,SQL Server如何实现?,如果一张表的数据达到上百万 - phpStudy...

    如果一张表的数据达到上百万条,用游标的方法来删除简直是个噩梦,因为它会执行相当长的一段时间-- 开发人员的噩梦--删除重复记录 想必每一位开发人员都有过类似的经历,在对数据库进行查询或统计的时候不时地 ...

  9. oracle两张表 比较好,比较Oracle两张表的数据是否一样

    比较Oracle两张表的数据是否一样 爱搞机 2008-10-21 11:00 在某些情况下,我们会需要比较两张表的数据是否一样. 假设有两张表A与表B他的字段相同,但是当中的数据可能不同,而且有些字 ...

最新文章

  1. 只知道用它打印了Hello World,除此之外你了解多少呢?
  2. 多线程编程 java_java多线程编程
  3. 【深度学习】基于深度神经网络进行权重剪枝的算法(二)
  4. 号称要打败阿尔法狗的DeepZenGo 高调挑战人类
  5. 计算文本相似度_Python文本相似性计算
  6. 二隐层的神经网络实现MNIST数据集分类
  7. su 切换,提示:“密码不正确”;
  8. 金域与华为云联合AI辅助宫颈癌筛查技术创出国际最高水平
  9. springboot动态切换数据源_Springboot整合Mybatis注解实现动态数据源切换
  10. centos7 docker端口_docker相关知识
  11. 2022年python大数据开发学习路线
  12. dbm与mysql_DBM数据库 | 学步园
  13. 树莓派3B+安装官方原版系统
  14. python requests 爬取代理ip并验证(快代理西祠代理)
  15. 刘强东深夜发文:京东物流去年亏损超过28亿,再亏融资只够撑两年
  16. 强大的图片预览组件Viewer.js
  17. 单臂路由+VRRP(多个vlan负载分担)
  18. 程序猿赚的那点钱算个P啊!
  19. 计算机映像缺失磁盘如何修复,Win10安装会遇到的问题汇总及解决方法
  20. 单片机实验(十三)串口自发自收实现

热门文章

  1. 优衣库电子快报里的“服适人生”
  2. 基于深度学习的影像深度重建综述
  3. 愿历尽千帆,归来仍是读书人
  4. 分节符导致 Word 中的一个意外的分页符
  5. 苹果iwatch手表_花朵财经送你苹果手表iwatch!
  6. 技术的发展推动了微型计算机的发展,微机原理第1章 习题答案(yyj)(3页)-原创力文档...
  7. 前向传播与反向传播的理解
  8. 利用腾讯云api实现手写字体识别
  9. 优化Python代码的4种方法
  10. Android实战技巧之十八:adb取出安装在手机中的apk