使用SqlBulkCopy实现Excel批量导入数据库

引言:

导入Excel数据时候,因为数据量大,使用 linq 操作插入的时候,很慢。考虑使用ado.net操作数据库方式导入数据。由于数据量比较大使用SqlBulkCopy来实现批量导入。

一.代码解释:

1.将要导入的excel上传保存到服务器。

2.使用OleDbDataAdapter获取excel中的数据插入tab中。

3.在内存中创建一个表newDT,将tab表做修改后更新到newDT中。

4.使用SqlBulkCopy批量将newDT内存表数据插入到数据库表Sys_StuUser中。

二.代码如下:

 string FileUrl = string.Empty;
                foreach (HttpPostedFileBase file in fileToUpload)
                {
                    string path = System.IO.Path.Combine(Server.MapPath("~/Models/stu/UpLoadExc"), System.IO.Path.GetFileName(DateTime.Now.ToString("yyyymmddhhMMss") + file.FileName));
                    file.SaveAs(path);//SaveAs 将上传的文件内容保存在服务器上
                    FileUrl = path;
                }
                string result = string.Empty;
                string strConn;
                strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + FileUrl + "; " + "Extended Properties=Excel 8.0;";
                OleDbConnection conn = new OleDbConnection(strConn);
                OleDbDataAdapter myCommand = new OleDbDataAdapter("SELECT * FROM [Sheet1$]", conn);

                DataSet myDataSet = new DataSet();
                myCommand.Fill(myDataSet, "ExcelInfo");
                System.Data.DataTable tab = myDataSet.Tables["ExcelInfo"].DefaultView.ToTable();
                var majordata = MajorInfoService.LoadEntities(u => true).ToList();
                var schooldata = UniversityInfoService.LoadEntities(u => true).ToList();
                // ...用foreach把tab中数据添加到数据库
                DataTable newDT = new DataTable();
                //newDT.Columns.Add("LoginID", typeof(string));
                newDT.Columns.Add("Pwd", typeof(string));
                newDT.Columns.Add("UserName", typeof(string));
                newDT.Columns.Add("Education", typeof(int));
                newDT.Columns.Add("Major", typeof(int));
                newDT.Columns.Add("StuOrigin", typeof(string));
                newDT.Columns.Add("Gender", typeof(int));
                newDT.Columns.Add("Destination", typeof(int));
                newDT.Columns.Add("HomeTel", typeof(string));
                newDT.Columns.Add("Tel", typeof(string));
                newDT.Columns.Add("Emai", typeof(string));
                newDT.Columns.Add("StudentID", typeof(string));
                newDT.Columns.Add("School", typeof(int));
                newDT.Columns.Add("GradYear", typeof(string));
                newDT.Columns.Add("IdentityID", typeof(string));
                //newDT.Columns.Add("IfJoin", typeof(string));
                //newDT.Columns.Add("Vcode", typeof(string));
                //newDT.Columns.Add("Flag", typeof(int));
                //newDT.Columns.Add("SID", typeof(string));

                for (int i = 0; i < tab.Rows.Count - 1; i++)
                {
                    DataRow dr = tab.Rows[i];
                    string SchoolTag = dr["学校代码"].ToString().Trim();
                    string MajorID = dr["专业代码"].ToString().Trim();
                    string DestinationID = dr["毕业去向"].ToString().Trim();
                    string EducationID = dr["学历代码"].ToString().Trim();
                    var schoolid = (from s in schooldata where s.UCode == SchoolTag select new { s.UID }).
                        FirstOrDefault();
                    var majorid =
                        (from m in majordata where m.MajorCode == MajorID select new { m.MajorID }).FirstOrDefault();
                    DataRow newRow = newDT.NewRow();
                    newRow["Pwd"] = "0B946149D7DDE1A273F26402A344008E";
                    newRow["UserName"] = dr["姓名"].ToString().Trim();
                    switch (EducationID)
                    {
                        case "01": newRow["Education"] = 4; break;
                        case "11": newRow["Education"] = 3; break;
                        case "31": newRow["Education"] = 2; break;
                        case "41": newRow["Education"] = 1; break;
                        default: newRow["Education"] = 0; break;
                    }
                    newRow["Major"] = majorid == null ? 0 : majorid.MajorID;
                    newRow["StuOrigin"] = dr["生源地"].ToString().Trim();
                    newRow["Gender"] = dr["性别代码"] == null ? 0 : Convert.ToInt32(dr["性别代码"].ToString().Trim());
                    switch (DestinationID)
                    {
                        case "01": newRow["Destination"] = 1; break;
                        case "02": newRow["Destination"] = 2; break;
                        case "03": newRow["Destination"] = 3; break;
                        case "04": newRow["Destination"] = 4; break;
                        default: newRow["Destination"] = 0; break;
                    }

                    newRow["HomeTel"] = dr["家庭电话"].ToString().Trim();
                    newRow["Tel"] = dr["手机号码"].ToString().Trim();
                    newRow["Emai"] = dr["电子邮箱"].ToString().Trim();
                    newRow["StudentID"] = dr["学号"].ToString().Trim();
                    newRow["School"] = schoolid == null ? 0 : schoolid.UID;
                    newRow["GradYear"] = dr["毕业年份"].ToString().Trim();
                    newRow["IdentityID"] = dr["身份证号"].ToString().Trim();

                    newDT.Rows.Add(newRow);

                }
                SqlBulkCopy sqlbulkcopy = new SqlBulkCopy(PubConstant.ConnectionString, SqlBulkCopyOptions.UseInternalTransaction);
                sqlbulkcopy.DestinationTableName = "Sys_StuUser";//数据库中的表名
                sqlbulkcopy.ColumnMappings.Add("Pwd", "Pwd");
                sqlbulkcopy.ColumnMappings.Add("UserName", "UserName");
                sqlbulkcopy.ColumnMappings.Add("Education", "Education");
                sqlbulkcopy.ColumnMappings.Add("Major", "Major");
                sqlbulkcopy.ColumnMappings.Add("StuOrigin", "StuOrigin");
                sqlbulkcopy.ColumnMappings.Add("Gender", "Gender");
                sqlbulkcopy.ColumnMappings.Add("Destination", "Destination");
                sqlbulkcopy.ColumnMappings.Add("HomeTel", "HomeTel");
                sqlbulkcopy.ColumnMappings.Add("Tel", "Tel");
                sqlbulkcopy.ColumnMappings.Add("Emai", "Emai");
                sqlbulkcopy.ColumnMappings.Add("StudentID", "StudentID");
                sqlbulkcopy.ColumnMappings.Add("School", "School");
                sqlbulkcopy.ColumnMappings.Add("GradYear", "GradYear");
                sqlbulkcopy.ColumnMappings.Add("IdentityID", "IdentityID");
                sqlbulkcopy.WriteToServer(newDT);
                return Content("上传成功!");
            }
时间: 2024-12-07 08:38:58

使用SqlBulkCopy实现Excel批量导入数据库的相关文章

poi excel批量导入 解决各类型的数据

String value=this.getValue((HSSFCell) row.getCell(position)) 数字类型  时间类型 字符串类型验证没问题, 数字类型如果是1234.0会将其变成1234  如果是1234.5保存仍然保持小数位1234.5,用来解决电话号码和普通数字问题 时间类型将其格式化成了 2015-12-09 12:13:12这种格式便于保存数据库 //解决类型问题,获得数值 public String getValue(HSSFCell cell) { Stri

批量导入数据库

public bool MsSqlBulkCopyData(DataTable dt, string connectionString) { bool result; try { using (SqlConnection conn = new SqlConnection(connectionString)) { conn.Open(); SqlTransaction trans = conn.BeginTransaction(); SqlBulkCopy sqlbulkCopy = new Sq

Excel批量导入商品,遇到导入失败记录到另一个Excel中供下载查看

1 /// <summary> 2 /// EXCEL批量导入 3 /// </summary> 4 /// <param name="filePath">文件路径</param> 5 /// <param name="shop">店铺</param> 6 /// <returns></returns> 7 public string BatchUploadProduct

利用OLEDB+SqlClient实现EXCEL批量导入数据

以下是几个自己写的类 /// <summary> /// 取得Excel对象 /// </summary> /// <param name="strConn">OLEDB连接字符串</param> /// <param name="sql">SQL语句</param> /// <returns></returns> public static DataTable GetE

EXCEL数据导入数据库实例(NPOI)

Default.aspx 页面代码: 引用了:    <script src="../../js/jquery.easyui.min.js" type="text/javascript"></script> <form id="fileForm" runat="server" enctype="multipart/form-data" method="post&quo

C#代码实现 Excel表格与Object互相转换,Excel表格导入数据库(.NET2.0 .NET4.0)

前些天在工作上遇到这个需求,在GitHub找到一个开源代码可以用,Fork了一个版本,整理一下发出来. ①.Net项目中使用Nuget安装一个 NPOI 包    https://github.com/tonyqus/npoi ②再Nuget安装 Chsword.Excel2Object 包    https://github.com/chsword/Excel2Object 也可以直接使用命令行(“Install-Package Chsword.Excel2Object”) 注:上述程序包是作

Excel批量导入数据之数据校验

最近,工作上接到Excel批量导入数据的需求.在这里,小编想分享的是数据校验那些事,至于如何读取Excel数据,大家可以百度下. 一般而言,Excel批量导入数据,我们都会给客户提供一个固定的模板以输入我们期望的数据.然而,客户的操作,我们是无法预料的,他们有可能增加一列或者删除一列,有可能去掉Excel某个字段的输入限制等等. Excel模板,有可能只有一个,有可能若干个.各个模板的数据列,或交叉相同,或存在个性化列. 同一个模板,也许因某列数据的不同,而需要填充不同数据列. ...... 面

[Asp.net]常见数据导入Excel,Excel数据导入数据库解决方案,总有一款适合你!

引言 项目中常用到将数据导入Excel,将Excel中的数据导入数据库的功能,曾经也查找过相关的内容,将曾经用过的方案总结一下. 方案一 NPOI NPOI 是 POI 项目的 .NET 版本.POI是一个开源的Java读写Excel.WORD等微软OLE2组件文档的项目.使用 NPOI 你就可以在没有安装 Office 或者相应环境的机器上对 WORD/EXCEL 文档进行读写.NPOI是构建在POI 3.x版本之上的,它可以在没有安装Office的情况下对Word/Excel文档进行读写操作

csv文件或者excel表格导入数据库

 将csv文件或者excel表格导入数据库的方法: Excel数据直接导入mysql会需要用到phpexcel开源类,详情使用可以参考这篇文章~ http://www.cnblogs.com/freespider/p/3284828.html 本文使用的方法是: Excel ——> CSV——>MySql 首先将excel另存为csv文件,然后开始分析数据. 代码如下: 1 <span style="font-size:18px;"><?PHP 2 //将