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

坚持的小马 2015-11-16 05:02:22
我现在使用的是NOPI来读取excel里面的数据,数据表的字段为15个字段,如果数据量超过4万及以上在编程的本地可以导入,但是在放上服务器之后,在局域网里面导入4万以上的数据的时候,就出现数据不能导入的情况。
...全文
540 9 打赏 收藏 转发到动态 举报
写回复
用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万条记录出错。 现在的问题是:你用的是什么数据库?是否起了事务?是否存在主键冲突?
exception92 2015-11-16
  • 打赏
  • 举报
回复
一下子 导入数据库的? 分批导入吧,http://www.cnblogs.com/shikyoh/archive/2011/07/01/2095633.html
C#程序开发范例宝典》(09章)的源码 第9章 数据库技术 355   9.1 连接Access数据库 356   实例254 连接Access数据库 356   实例255 连接加密的Access数据库 357   实例256 自动识别Access 2000数据库路径 358   实例257 连接网络上共享的Access 2000数据库 360   9.2 连接SQL Server数据库 361   实例258 使用ODBC DSN连接SQL Server数据库 361   实例259 使用ODBC非DSN连接SQL Server数据库 364   实例260 使用OLE DB连接SQL Server数据库 365   实例261 建立SQL Server数据库连接 366   9.3 连接其他数据库 367   实例262 连接Excel 367   实例263 连接Oracle数据库 368   9.4 数据库结构的读取与修改 369   实例264 读取SQL Server数据库结构 369   实例265 修改SQL Server数据库结构 372   9.5 数据录入 374   实例266 利用数据绑定控件录入数据 374   实例267 使用ADO NET对象录入数据 376   实例268 利用SQL语句录入数据 379   实例269 利用存储过程录入数据 380   9.6 图片存取技术 383   实例270 使用存取文件名的方法存取图片 383   实例271 使用ADO NET对象向SQL Server数据库存入图片 384   9.7 数据修改 387   实例272 利用数据绑定控件修改数据 387   实例273 利用数据对象修改数据 390   实例274 利用SQL语句修改数据 391   实例275 利用存储过程修改数据 393   9.8 数据保存前判断 395   实例276 判断输入数据是否符合要求 395   实例277 通过存储过程实现自动编号 398   9.9 数据删除 401   实例278 删除表格指定的记录 401   实例279 利用SQL语句删除数据 402   9.10 数据记录 403   实例280 分页显示信息 403   实例281 移动记录 404   9.11 数据维护 406   实例282 在C#分离SQL Server数据库 406   实例283 在C#附加SQL Server数据库 407   实例284 在C#附加单文件SQL Server数据库 409   9.12 数据备份恢复 410   实例285 备份SQL Server数据库 410   实例286 还原SQL Server数据库 413   9.13 管理系统开发相关 415   实例287 开启SQL Server数据库 415   实例288 断开SQL Server数据库与其他应用程序的连接 417   实例289 带图像列表的系统登录程序 419   实例290 利用SQL语句执行外围命令 420   实例291 系统初始化 421

110,535

社区成员

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

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

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