请教一个Excel导入数据库的问题

諾临風 2014-07-14 08:40:11
由于甲方的需要比较奇怪,所以不要考虑改变需求信息这些东西。

一、一个Excel的字段大约是20个左右,数据大约是十万条左右。
二、数据库里的数据至少在三十万以上。

以上是背景,现在要做一个Excel导入,但这个数据可能是几万,可能是十来万,
在数据库中存在相同的数据,我们在导入的时候,重复的不需要导入,

请教一下思路,我要如何快速又效率方便的解决问题呢?
...全文
246 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
这个问题挺容易解决的,把Excel处理任务用多线程去处理,用任务列表显示当前处理状态,这既不影响你主界面的其他操作,又能跟进任务处理进度。
xxoo2007 2014-07-15
  • 打赏
  • 举报
回复
先落地后导入 先把EXCEL的文件写到一个新表中,关键字建索引,关联查询找出有的打上标记,然后再导入业务表
dengchenlu 2014-07-15
  • 打赏
  • 举报
回复
我以前的做法是全部导入,然后删除重复的旧版信息
hnczljt 2014-07-15
  • 打赏
  • 举报
回复
建一张临时表,导入数据库临时表,然后在数据库判断是否重复等问题,然后把需要的数据导入到正式表。
  • 打赏
  • 举报
回复
判断重复的字段把索引加上
  • 打赏
  • 举报
回复
慢在逻辑判断上 sql 万条/秒 是没问题的
於黾 2014-07-15
  • 打赏
  • 举报
回复
把导入做成存储过程,让数据库自己去判断是否重复,应该会比在客户端判断效率高很多.
余生Her 2014-07-15
  • 打赏
  • 举报
回复
NPOI可以看一下,速度非常快
webdiyer 2014-07-15
  • 打赏
  • 举报
回复
引用 9 楼 webdiyer 的回复:
导入十万数据不会太慢,但要判断是否重复可能得耽误不少时间,这取决于你的数据库架构及业务逻辑,如果可以的话,把excel和数据库中的数据都取出来在内存中进行判断,去掉重复的数据然后插入,但这样得避免在导入时其它用户对数据库插入新的记录
数据库中的记录只取判断是否重复的主键字段,而不是全部取出
webdiyer 2014-07-15
  • 打赏
  • 举报
回复
导入十万数据不会太慢,但要判断是否重复可能得耽误不少时间,这取决于你的数据库架构及业务逻辑,如果可以的话,把excel和数据库中的数据都取出来在内存中进行判断,去掉重复的数据然后插入,但这样得避免在导入时其它用户对数据库插入新的记录
  • 打赏
  • 举报
回复
批量把Excel文件导入SQL Server数据库 //导出按钮Click事件 private void btn_Export_Click(object sender, EventArgs e) { string[] P_str_Names = txt_Path.Text.Split(',');//存储所有选择的Excel文件名 string P_str_Name = "";//存储遍历到的Excel文件名 List<string> P_list_SheetNames = new List<string>();//实例化泛型集合对象,用来存储工作表名称 for (int i = 0; i < P_str_Names.Length - 1; i++)//遍历所有选择的Excel文件名 { P_str_Name = P_str_Names[i];//记录遍历到的Excel文件名 P_list_SheetNames = GetSheetName(P_str_Name);//获取Excel文件中的所有工作表名 for (int j = 0; j < P_list_SheetNames.Count; j++)//遍历所有工作表 { if (rbtn_Access.Checked)//判断Access数据库连接设置单选按钮选中 { ImportDataToAccess(P_str_Name, P_list_SheetNames[j]);//将将工作表内容导出到Access } else if (rbtn_Sql.Checked)//判断Sql Server数据库连接设置单选按钮选中 { if (ckbox_Windows.Checked)//如果用Windows身份验证登录Sql Server ImportDataToSql(P_str_Name, P_list_SheetNames[j], "Data Source=" + txt_Server.Text + ";Initial Catalog =" + cbox_Server.Text + ";Integrated Security=SSPI;");//将工作表内容导出到Sql Server else if (ckbox_SQL.Checked)//如果用Sql Server身份验证登录Sql Server ImportDataToSql(P_str_Name, P_list_SheetNames[j], "Data Source=" + txt_Server.Text + ";Database=" + cbox_Server.Text + ";Uid=" + txt_Name.Text + ";Pwd=" + txt_Pwd.Text + ";");//将工作表内容导出到Sql Server } } } MessageBox.Show("已经将所有选择的Excel工作表导入到了指定的数据库中!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); } //存储到泛型集合中 private List<string> GetSheetName(string P_str_Excel)//获取所有工作表名称 { List<string> P_list_SheetName = new List<string>();//实例化泛型集合对象 //连接Excel数据库 OleDbConnection olecon = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + P_str_Excel + ";Extended Properties=Excel 8.0"); olecon.Open();//打开数据库连接 System.Data.DataTable DTable = olecon.GetSchema("Tables");//实例化表对象 DataTableReader DTReader = new DataTableReader(DTable);//实例化表读取对象 while (DTReader.Read())//循环读取 { string P_str_Name = DTReader["Table_Name"].ToString().Replace('$', ' ').Trim();//记录工作表名称 if (!P_list_SheetName.Contains(P_str_Name))//判断泛型集合中是否已经存在该工作表名称 P_list_SheetName.Add(P_str_Name);//将工作表名添加到泛型集合中 }//CodeGo.net/ DTable = null;//清空表对象 DTReader = null;//清空表读取对象 olecon.Close();//关闭数据库连接 return P_list_SheetName;//返回得到的泛型集合 }//其余代码字符限制传不了,敬请谅解
yzf86211861 2014-07-15
  • 打赏
  • 举报
回复
引用 1 楼 diaodiaop 的回复:
google it sqlbulkcopy 这个应该是效率最高的了...不过业务处理靠你自己了
MARK
諾临風 2014-07-15
  • 打赏
  • 举报
回复
引用 4 楼 sp1234 的回复:
你这个导入,每天做几次?
这个是石油项目,次数不定,但数据量不是一般的大,几十万条记的,速度太慢受不了。 这样导是因为这个EXCEL出自于另外一个系统,没有接口,拿不到文档,只能从这表格中的数据进行分析, 导进去做同步操作。
諾临風 2014-07-14
  • 打赏
  • 举报
回复
引用 1 楼 diaodiaop 的回复:
google it sqlbulkcopy 这个应该是效率最高的了...不过业务处理靠你自己了
我要的就是速度,别的都比较好说,一直找不到解决方案,我现在就试试。
EdsionWang 2014-07-14
  • 打赏
  • 举报
回复
有个类似的需求正在做。好在我的数据量不大,现在按年份将数据整理出来了,准备按年逐步导入。 学习 下更好的方法
  • 打赏
  • 举报
回复
你这个导入,每天做几次?
by_封爱 2014-07-14
  • 打赏
  • 举报
回复
google it sqlbulkcopy 这个应该是效率最高的了...不过业务处理靠你自己了
諾临風 2014-07-14
  • 打赏
  • 举报
回复
我用的是Oracle啊。。。还有没有给点建议或是思路。

62,067

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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