《项目心得》-简单三层使用DataTable向数据库表批量导入数据-向SqlServer一张表中导入数据
《项目经验》--简单三层使用DataTable向数据库表批量导入数据---向SqlServer一张表中导入数据
向数据库的一张表中添加数据,可以采用单个添加,即一条数据、一条数据的添加;也可以采用批量导入,依次将好些条数据写入数据库的一张表中。文本借助实例《添加系列信息》讲解一种向数据库批量导入数据的方法。
1.界面设计
观看一下添加系列信息部分的界面设计:
本文主要介绍批量导入系列信息的实现,单个添加的实现不在此文讲解之列!
2.框架结构
此项目的实现,我采用简单的三层,看一下项目框架
3.批量导入数据的实现
下面逐层介绍每层实现:
3.1 SqlHelper数据库助手类中添加向数据库表导入数据的方法(SqlHelper.cs)
#region 批量导入datatable /// <summary> /// 批量导入datatable /// </summary> /// <param name="dt">数据表</param> /// <param name="TabelName">数据表名</param> /// <param name="dtColum">列集合</param> public int InsertTable(DataTable dt, string TabelName, DataColumnCollection dtColum) { //打开数据库 GetConn(); try { //声明SqlBulkCopy ,using释放非托管资源 using (SqlBulkCopy sqlBC = new SqlBulkCopy(conn)) { //一次批量的插入的数据量 //sqlBC.BatchSize = 1000; //超时之前操作完成所允许的秒数,如果超时则事务不会提交 ,数据将回滚,所有已复制的行都会从目标表中移除 //sqlBC.BulkCopyTimeout = 60; //設定 NotifyAfter 属性,以便在每插入10000 条数据时,呼叫相应事件。 //sqlBC.NotifyAfter = 10000; // sqlBC.SqlRowsCopied += new SqlRowsCopiedEventHandler(OnSqlRowsCopied); //设置要批量写入的表 sqlBC.DestinationTableName = TabelName; //自定义的datatable和数据库的字段进行对应 for (int i = 0; i < dtColum.Count; i++) { sqlBC.ColumnMappings.Add(dtColum[i].ColumnName.ToString(), dtColum[i].ColumnName.ToString()); } //批量写入 sqlBC.WriteToServer(dt); } //导入成功,返回1 return 1; } catch { //导入失败返回-1 return -1; } finally { //关闭数据库 conn.Close(); } } #endregion
3.2.DAL层批量导入数据的代码(DaoSeries.cs)
#region 批量导入系列信息 /// <summary> /// 批量导入系列信息 /// </summary> /// <param name="dt">DataTable数据表-dt;</param> /// <param name="dtColum">DataColumnCollection 列集合-dtColum</param> /// <returns>整数:大于0代表导入成功;否则导入失败</returns> public int ImportDatatable(DataTable dt, DataColumnCollection dtColum) { //定义一个整型标记变量 int result; //调用sqlHelper的"批量导入datatable表"的方法 result = sqlheler.InsertTable(dt, "T_SeriesInfo", dtColum); //返回结果 return result; } #endregion
3.3.BLL层批量导入数据的代码(MgrSeriesManager.cs)
#region 批量导入系列 /// <summary> /// 批量导入系列 /// </summary> /// <param name="dt">数据表</param> /// <param name="dtColum">数据列集合</param> /// <returns>整数:大于0代表导入成功,否则导入失败</returns> public int ImportDatatable(DataTable dt, DataColumnCollection dtColum) { DaoSeries series=new DaoSeries(); return series.ImportDatatable(dt, dtColum); } #endregion
3.4.界面层构造DataTable数据,向BLL层传递(FrmSeriesManager.aspx,FrmSeriesManager.aspx.cs)
这里构造DataTable数据,我是采用从界面上传Excel,然后从Excel获取输入然后存入DataTable的
3.4.1 从界面传入Excel,调用BLL层Excel转换成DataTable的方法实现
#region 批量导入系列 /// <summary> /// 批量导入系列 /// </summary> protected void btnImportSeries_Click(object sender, EventArgs e) { //BLL层,添加系列信息类 MgrSeriesManager series = new MgrSeriesManager(); //BLL层把excel转化为datatable的方法 MgrCreateExcelData createExcelData = new MgrCreateExcelData(); //获取上传文件地址 string url = fupImprotSeries.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 dt; //在系统中建文件夹up,并将excel文件另存 this.fupImprotSeries.SaveAs(Server.MapPath("~\\up") + "\\" + urlLocation);//记录文件名到服务器相对应的文件夹中 // Response.Write(urlLocation); //获得文件路径 string strpath = Server.MapPath("~\\up") + "\\" + urlLocation; //string strpath = "c:\\abc.xls"; // Response.Write(strpath); //把excel转换为datatable dt = createExcelData.CreateExcelDataSource(strpath); DataColumnCollection dcc = dt.Columns; //导入数据库 int i = series.ImportDatatable(dt, dcc); if (i > 0) { 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.2 BLL层Excel转换成DataTable的类(MgrCreateExcelData.cs)
/************************************************* 作者:jql 小组:一中考核系统 说明:把excel转化为datatable 创建日期:2012年11月25日14:17:06 版本号: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; namespace BLL { public class MgrCreateExcelData { public MgrCreateExcelData() { } /// <summary> /// 传入excel路径,转换为datatable /// </summary> /// <param name="url"></param> /// <returns></returns> public DataTable CreateExcelDataSource(string url) { DataTable dt = null; // string connetionStr = "Provider=Microsoft.Ace.OleDb.12.0;" + "Data Source=" // +url + ";" + "Extended Properties='Excel 8.0;HDR=Yes;IMEX=1';"; //获得excel数据 string connetionStr = "Provider=Microsoft.Jet.OleDb.4.0;" + "data source=" + url + ";Extended Properties='Excel 8.0; HDR=YES; IMEX=1'"; string strSql = "select * from [Sheet1$]"; OleDbConnection oleConn = new OleDbConnection(connetionStr); OleDbDataAdapter oleAdapter = new OleDbDataAdapter(strSql, connetionStr); try { //把excel数据填充给datatable dt = new DataTable(); oleAdapter.Fill(dt); return dt; } catch (Exception ex) { throw ex; } finally { oleAdapter.Dispose(); oleConn.Close(); oleConn.Dispose(); } } } }
至此向数据库批量导入数据就实现了,如果你想对要导入数据库的数据做合法性判断,执行Excel转换成Datatable时,自己加些判断处理就行了!
下面这篇文章介绍了向数据库多张表批量导入数据的实现:《项目经验---简单三层使用DataTable向数据库表批量导入数据---向SqlServer多张张表中导入数据》!
- 1楼tcl_6666昨天 15:03
- 我是娟姐忠实的粉丝