C#实现的从excel读取数据,然后存储到数据库中。

坚持的小马 2015-11-16 05:02:22
我现在使用的是NOPI来读取excel里面的数据,数据表的字段为15个字段,如果数据量超过4万及以上在编程的本地可以导入,但是在放上服务器之后,在局域网里面导入4万以上的数据的时候,就出现数据不能导入的情况。
...全文
562 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
坚持的小马 2015-11-17
  • 打赏
  • 举报
回复
我使用的数据库是 sql server 2005
坚持的小马 2015-11-17
  • 打赏
  • 举报
回复
protected void Btn_import_Click(object sender, EventArgs e) { //判断是否选择报表时间 try { //导入文件是否存在 if (!File_Import.HasFile) { Jscript.Alert("请选择文件", "导入提示"); //ClientScript.RegisterStartupScript(this.GetType(), "clientScipt", "alert('请选择文件');", true); File_Import.Focus(); return; } string fileSavePath = Server.MapPath("~/ExcelTemp/") + DateTime.Now.Ticks.ToString() + File_Import.FileName; ////保存文件 File_Import.SaveAs(fileSavePath); HiddenField1.Value = fileSavePath; ////清空导入时间 //lbImportTime.Text = ""; Stopwatch myWatch = Stopwatch.StartNew(); DataTable dt = NOPIHelper.ExcelToDataTable(fileSavePath, "sheet1", true); int maxrows = dt.Rows.Count;//行数 int maxcolumns = dt.Columns.Count;//列数 int validNum = 0;///有效数据条数 string result = string.Empty; string FailLog = string.Empty; string AccessLog = string.Empty; //用bcp导入数据 //using (System.Data.SqlClient.SqlBulkCopy bcp = new System.Data.SqlClient.SqlBulkCopy(connectionString)) //{ // bcp.SqlRowsCopied += new System.Data.SqlClient.SqlRowsCopiedEventHandler(bcp_SqlRowsCopied); // bcp.BatchSize = 100;//每次传输的行数 // bcp.NotifyAfter = 100;//进度提示的行数 // bcp.DestinationTableName = "dbo.Tb_Data"; //目标表 // bcp.WriteToServer(dt); //} if (dt != null && maxrows > 0) { if (maxcolumns > 0) { foreach (DataRow dr in dt.Rows) { insertToSql(dr); validNum++; } } } //进度显示 //在数据导入的时候,将报表的时间获取到隐藏的控件中,然后方便在确认导入的数据对数据进行获取 LImportLog.Text = "成功导入" + validNum + "条记录。<br />" + AccessLog + "<br />-------------------------------<br />" + FailLog + "<br />"; //记录运行时间 //myWatch.Stop(); lbImportTime.Text = myWatch.ElapsedMilliseconds.ToString(); //LJs.Text = "<script type=\"text/javascript\">openDialog(200, 400, \"importLogDiv\", \"\")</script>"; importLogDiv.Visible = true; 这个是我的数据库导入的代码,没有起事务,在进行sql跟踪的时候,在服务器在上跑的话,就不能进行for循环,我点击数据导入按钮,界面像被刷新一次,然后数据库里面没有导入一条数据
坚持的小马 2015-11-17
  • 打赏
  • 举报
回复
我已找到但是程序还是讲第二列的数据写入到数据库的第一列中。因为获取数据的帮助类是从第二列开始读取数据。谢谢各位的帮助,我才能这么快的解决问题,非常感谢两位热心的朋友。
坚持的小马 2015-11-17
  • 打赏
  • 举报
回复
谢谢两位的热心帮忙。我已经找到了异常的代码了。 sqlcmd.Connection = srcConnection; //sqlcmd.CommandText = "select * from jobs"; sqlcmd.CommandText = @"SELECT [phone],[zd1],[zd2] ,[zd3] ,[zd4],[zd5],[zd6],[zd7],[zd8],[zd9],[zd10],[zd11],[zd12],[zd13],[zd14] FROM [DataHandle].[dbo].[Tb_Data]"; sqlcmd.CommandType = CommandType.Text; sqlcmd.Connection.Open(); da.SelectCommand = sqlcmd; da.Fill(dt);这段为出现异常的代码。我现在已经能通过SqlBulkCopy 这个将数据成功导入到数据库中,唯一的问题就是,我用这个导入数据的时候,我的excel的第一列的数据,不能导入到数据库的第一列,我在代码中写了 sbc.ColumnMappings.Add("phone", "phone");但是程序还是讲第二列的数据写入到数据库的第一列中。
坚持的小马 2015-11-17
  • 打赏
  • 举报
回复
我现在将代码改成如下: startTime = DateTime.Now; string srcConnString = ""; string desConnString = ""; SqlConnection srcConnection = new SqlConnection(); SqlConnection desConnection = new SqlConnection(); SqlCommand sqlcmd = new SqlCommand(); SqlDataAdapter da = new SqlDataAdapter(); DataTable dt = NOPIHelper.ExcelToDataTable(HiddenField1.Value, "sheet1", true); //srcConnString = ConfigurationManager.ConnectionStrings["srcDBConnection"].ConnectionString; desConnString = PubConstant.ConnectionString; //srcConnection.ConnectionString = srcConnString; srcConnection.ConnectionString = desConnString; sqlcmd.Connection = srcConnection; //sqlcmd.CommandText = "select * from jobs"; sqlcmd.CommandText = @"SELECT [phone],[zd1],[zd2] ,[zd3] ,[zd4],[zd5],[zd6],[zd7],[zd8],[zd9],[zd10],[zd11],[zd12],[zd13],[zd14] FROM [DataHandle].[dbo].[Tb_Data]"; sqlcmd.CommandType = CommandType.Text; sqlcmd.Connection.Open(); da.SelectCommand = sqlcmd; da.Fill(dt); SqlBulkCopy sbc = new SqlBulkCopy(desConnString, SqlBulkCopyOptions.UseInternalTransaction); sbc.BulkCopyTimeout = 5000; sbc.SqlRowsCopied += new SqlRowsCopiedEventHandler(OnRowsCopied); sbc.NotifyAfter = dt.Rows.Count; try { // sbc.DestinationTableName = "jobs"; sbc.DestinationTableName = "dbo.Tb_Data"; sbc.WriteToServer(dt); } catch (Exception ex) { lblCounter.Text = ex.Message.ToString(); } finally { sqlcmd.Clone(); srcConnection.Close(); desConnection.Close(); } 现在调式的时候报引发类型为“System.OutOfMemoryException”的异常。我这个是不是因为数据量太大的原因呢
caojinrong 2015-11-17
  • 打赏
  • 举报
回复
                        insertToSql(dr);
在这一句加断点看看怎么回事
caojinrong 2015-11-17
  • 打赏
  • 举报
回复
            DataTable dt = NOPIHelper.ExcelToDataTable(fileSavePath, "sheet1", true);
数据量大时,读取到内存表不可取,应该起事务逐行插入,你的代码没有处理主键,难道是没有主键?
caojinrong 2015-11-16
  • 打赏
  • 举报
回复
这问题也太笼统了,就一句数据不能导入,大致帮你分析一下吧, 本地可以导入说明读取excel部分没问题,虽然4万条数据用NPOI(注意是POI,不是OPI)读取比较耗时但问题中没有体现。问题就变为在局域网内向数据库服务器写入4万条记录出错。 现在的问题是:你用的是什么数据库?是否起了事务?是否存在主键冲突?
  • 打赏
  • 举报
回复
一下子 导入数据库的? 分批导入吧,http://www.cnblogs.com/shikyoh/archive/2011/07/01/2095633.html

111,093

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧