Excel大数据量分段导入到Oracle
客户需要将一个具有2W多条数据的Excel表格中的数据导入到Oracle数据库的A表中,开始采用的是利用Oledb直接将数据读入到DataTable中,然后通过拼接InserInto语句来插入到数据库表A中.然后做好以后,发现经常提示Invalidate Character错误.但是将拼接好的SQL拿到PLSQL中执行,一切完好.最后没办法,为了缩小错误范围,开始利用begin end分段来做.具体方式为:
每隔1000条数据,加上形如 Begin ...这里是1000条数据... End;Commit; 的标记
具体后台代码如下:
using System;
using System.Data;
using System.Data.OracleClient;
using Microsoft.Office.Interop.Excel;
using Excel = Microsoft.Office.Interop.Excel;
using RedGlovePermission.Lib;
using System.IO;
using System.Data.OleDb;
using System.Data;
using System.Configuration;
using System.Text;
using System.Collections;
using System.Collections.Generic;
using System.Web.UI; public partial class YQKH_YQKH_OACL : BasePageWithLog,ICallbackEventHandler
{
private BusinessLogicLayer.ICommonBLL _CommonBLL;
public BusinessLogicLayer.ICommonBLL CommonBLL
{
get
{
return _CommonBLL;
}
set
{
_CommonBLL = value;
}
}
public static string result = string.Empty;
protected void Page_Load(object sender, EventArgs e)
{
this.DBGridConfig1.openURL = "../CommData/GetDataByParameter.aspx?sqlKey=t_yqkh_oa_mx"; //加载需要进行导入的表中的数据
} protected void toExcel_Click(object sender, EventArgs e)
{
if (UploadExcel.HasFile) //如果存在上传文件
{
string filename = UploadExcel.PostedFile.FileName;
String strConnectionString = string.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties='Excel 8.0;IMEX=1'", filename);//serverpath是Excel表格路径
using (OleDbConnection Excel_conn = new OleDbConnection(strConnectionString)) //连接Excel,和连接MSSQL数据库的方式类似
{
Excel_conn.Open(); //打开连接
System.Data.DataTable dtExcelSchema = Excel_conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });//建立连接Excel的数据表
string SheetName = "";
SheetName = dtExcelSchema.Rows[3]["TABLE_NAME"].ToString();//取需要的工作表的名称
System.Data.DataTable dt = new System.Data.DataTable();
try
{
string strExcel = "";
OleDbDataAdapter myCommand = null;
strExcel = string.Format(" select * from [{0}] ", SheetName); //取工作表中的所有数据
myCommand = new OleDbDataAdapter(strExcel, Excel_conn);
myCommand.Fill(dt);
}
catch (Exception ex){} using (OracleConnection oraconn = new OracleConnection(ConfigurationManager.AppSettings["SQLString"].ToString())) //打开oracle数据库
{
oraconn.Open(); IList<StringBuilder> _list = ExecInsertIntoOracleFromExcel(dt); //list中保存的是多个需要提交的事物段
foreach (StringBuilder sb in _list) //循环,按照段来执行
{
OracleCommand oracmd = new OracleCommand(sb.ToString(), oraconn);
oracmd.ExecuteNonQuery();
}
//Response.Write("导入成功!");
ClientScript.RegisterClientScriptBlock(Page.GetType(), "alertSuccess", "<script>alert('导入成功!')</script>");
this.DBGridConfig1.openURL = "../CommData/GetDataByParameter.aspx?sqlKey=t_yqkh_oa_mx";
}
}
}
} public int iCount = 0;
private IList<StringBuilder> ExecInsertIntoOracleFromExcel(System.Data.DataTable dt)
{
IList<StringBuilder> iList = new List<StringBuilder>();
try
{
this._CommonBLL.ExecuteQuery("delete from db_zgfz.t_yqkh_oa");
}
catch(Exception ex)
{
Page.ClientScript.RegisterClientScriptBlock(Page.GetType(),"alertFail","<script>删除数据失败!</script>");
} if (dt != null)
{
if (dt.Rows.Count > 0)
{
StringBuilder sql = new StringBuilder();
sql.Append("begin ");
foreach (DataRow dr in dt.Rows)
{
iCount++;
sql.Append(" insert into db_zgfz.t_yqkh_oa values('" + dr["受理号"].ToString() + "','" +
dr["企业名称"].ToString() + "','" +
dr["事项名称"].ToString() + "','" +
dr["事项所属类别"].ToString() + "','" +
dr["事项ID"].ToString() + "','" +
dr["工作环节"].ToString() + "','" +
dr["部门"].ToString() + "','" +
dr["流经部门开始日期"].ToString() + "','" +
dr["流经部门结束日期"].ToString() + "'); ");
if (iCount % 1000 == 0) //每隔1000条数据,当做一段来执行,缩小出错范围
{
sql.Append(" commit; end; ");
iList.Add(sql);
sql = new StringBuilder();
sql.Append("begin "); }
else if (dt.Rows.Count == iCount)
{
sql.Append(" commit; end; ");
iList.Add(sql);
}
}
}
} return iList ;
} #region ICallbackEventHandler 成员 public string GetCallbackResult() //主要显示当前插入了多少条数据
{
return "当前共导入:"+result+"条数据!";
} public void RaiseCallbackEvent(string eventArgument)
{
string sql = "SELECT COUNT(*) FROM t_yqkh_oa";
System.Data.DataTable dtt = this._CommonBLL.ADONETHelper.GetDataTableBySQL(CommandType.Text, sql);
if (dtt != null)
{
if (dtt.Rows.Count > 0)
{
result = dtt.Rows[0][0].ToString();
}
}
} #endregion
}
前台代码如下:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="YQKH_OACL.aspx.cs" Inherits="YQKH_YQKH_OACL" %>
<%@ Register Src="~/inc/DBGridConfig.ascx" TagName="DBGridConfig" TagPrefix="uc1" %>
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
<title>外部数据导入</title>
<script language="javascript" src="../XmlDataSet/javascript/System.js"></script>
<script language="javascript" src="../XmlDataSet/javascript/ajax.js"></script>
<script language="JavaScript" src="../XmlDataSet/javascript/DataSet.js"></script>
<script language="JavaScript" src="../XmlDataSet/javascript/Control.js"></script>
<script language="JavaScript" src="../XmlDataSet/javascript/DBControl.js"></script>
<script language="JavaScript" src="../XmlDataSet/javascript/DBNavigator.js"></script>
<script language="JavaScript" src="../XmlDataSet/javascript/DBPageNavigator.js"></script>
<script language="JavaScript" src="../XmlDataSet/javascript/DBGrid.js"></script>
<script language="JavaScript" src="../XmlDataSet/javascript/ToolBar.js"></script>
<script language="javascript" src="../XmlDataSet/javascript/DBSearchToolBar.js"></script>
<script language="javascript" src="../javascripts/Collection.js"></script>
<script language="javascript" type="text/javascript" src="../javascripts/validator.js"></script>
<link href="../css/dtree.css" rel="stylesheet" type="text/css" />
<link href="../css/tables.css" rel="stylesheet" type="text/css" />
<link href="../css/main.css" rel="stylesheet" type="text/css" /> <script type="text/javascript">
var jcl_ResourceURL = "../XmlDataSet/javascript/images/";
function rServer(arg,context)
{
document.getElementById("info").innerHTML=arg;
}
function raiseCallBack(arg, context) {
<%=ClientScript.GetCallbackEventReference(this,"arg","rServer","context") %>;
}
window.onload=function(){
raiseCallBack();
}
setInterval('raiseCallBack()',2000);
</script> </head>
<body>
<form id="form1" runat="server">
<table><tr><td></td><td>
<table border="2" cellpadding="0" cellspacing="0" width="90%" align="center" style="border-collapse:collapse; text-align:center; ">
<thead>
<th align="center" colspan="4" style="font-size:large;">外部数据导入</th>
</thead>
<tbody>
<tr>
<td style="font-size:medium;" align="left"> </td>
<td style="font-size:medium;" align="left"> </td>
<td>
<asp:FileUpload ID="UploadExcel" runat="server" CssClass="inputButton" Width="300px" />
<asp:Button ID="toExcel" runat="server" Text="导入数据" CssClass="inputButton" onclick="toExcel_Click" />
</td>
<td id="info">
</td>
</tr>
<tr><td colspan="4"><hr /></td></tr>
<tr>
<td colspan="4">
<uc1:DBGridConfig ID="DBGridConfig1" runat="server" configKey="t_yqkh_oa_mx" isCanEdit="false" postURL="../CommData/UpdateData.aspx" />
</td>
</tr>
</tbody>
</table>
</td></tr></table>
</form>
</body>
</html>
这样,当插入的时候,不断的Select count(*) from A 语句,就会发现数据时呈1000往上递增的,出现问题的时候,也会提示哪次插入出现错误了,很方便.
Excel大数据量分段导入到Oracle的更多相关文章
- java excel大数据量导入导出与优化
package com.hundsun.ta.utils; import java.io.File; import java.io.FileOutputStream; import java.io.I ...
- java 导出Excel 大数据量,自己经验总结!
出处: http://lyjilu.iteye.com/ 分析导出实现代码,XLSX支持: /** * 生成<span style="white-space: normal; back ...
- SQL Server 使用bcp进行大数据量导出导入
转载:http://www.cnblogs.com/gaizai/archive/2010/04/17/1714389.html SQL Server的导出导入方式有: 在SQL Server中提供了 ...
- MySQL大数据量的导入
最近在公司备份数据库数据,简单的看了一下.当然我用的是简单的手动备份. 第一:其实最好的方法是直接用: mysqldump -u用户名 -p密码 数据库名 < 数据库名.sql 在linux在操 ...
- java 导出Excel 大数据量,自己经验总结!(二)
在上一次的基础上加上了样式,以及中文列名 package com.tommy.fundation.util; import java.io.OutputStream; import java.util ...
- POI 生成excel(大数据量) SXSSF
使用POI 的SXSSF (Streaming Usermodel API)生成较大的excel,同时开启压缩 import junit.framework.Assert; import org.ap ...
- 使用OPENROWSET、Microsoft.ACE.OLEDB实现大数据量的高效导入
首先说明使用的环境是:java和Sqlserver. 最近公司需要进行大数据量的导入操作.原来使用的是Apache POI,虽然可以实现功能,但是因为逻辑处理中需要进行许多校验,处理速度太慢,使用多线 ...
- (转)利用WPF的ListView进行大数据量异步加载
原文:http://www.cnblogs.com/scy251147/archive/2012/01/08/2305319.html 由于之前利用Winform的ListView进行大数据量加载的时 ...
- 利用WPF的ListView进行大数据量异步加载
原文:利用WPF的ListView进行大数据量异步加载 由于之前利用Winform的ListView进行大数据量加载的时候,诟病良多,所以今天试着用WPF的ListView来做了一下,结果没有让我失望 ...
随机推荐
- WPF笔记一
笔记内容: BUG.WPF运行窗体时调用Hide()方法,然后再Show()异常的解决方案 WPF 窗体设置为无边框 选择本地文件 选择文件夹 WPF实现右下角弹出消息窗口 WPF 显示 HTTP 网 ...
- Photoshop CS6 for Mac简体中文正式 完美破解版 支持Retina屏
Photoshop CS6 MAC 中文版破解版 支持Retina屏 目前世界上“最好的化妆品”是一款叫做PhotoShop的产品,它可以帮你去除所有你不满意的地方.上周末,这款最好的化妆品推出了第十 ...
- Jenkins FTP 上传
需要插件:FTP publisher plugin 进入 Jenkins / 系统管理 / 系统设置 找到 FTP repository hosts,新增一个,编辑好,保存 打开 Jenkins / ...
- PHP高手如何修炼?
关键字:PHP相关 数据库类 网页相关 服务器相关 数据结构.算法 学习PHP基本功很重要, 最好有数据结构和算法的学习经历. 第一阶段:1-2年新手入门,基础必须完全掌握 smarty+pear+ ...
- SQL SERVER 2008 如何查询含有某关键词的表
最新文章:Virson's Blog 文章来自:百度知道 /** 查询一个数据库中所有的数据中是否包含指定字符串 */ ) set @str='字符串' --要搜索的字符串 ) declare tb ...
- Microsoft 2013 新技术学习笔记 一
有几年没有关注技术了,最近有点时间想把技术重新捡起来,借着重构手上的一个后台管理框架的机会将微软新的几种技术全部应用一下,从目的上来讲并没有希望能对涉及的技术有很深入的了解,所以这个系列的文章(篇幅不 ...
- ubuntu 安装bochs
//首先官网下载bochs源码wget http://bochs.sourceforge.net/svn-snapshot/bochs-20150503.tar.gz//然后解压 tar vxzf b ...
- WebKit内核分析之Page
参考地址:http://blog.csdn.net/dlmu2001/article/details/6213377 注:本系列博客是在原博主博客基础上增加了自己的理解和片段,可以看源博文获得清晰的结 ...
- linux 下面 jdk1.7 rpm 包的安装
1.下载安装jdk7.0 for linux 我下载的版本为:jdk-7u2-linux-i586.rpm 下载地址为:http://www.oracle.com/technetwork/java/j ...
- hessian入门
hessian简介 Hessian是二进制的web service协议,官方网站提供Java.Flash/Flex.Python.C++..NET C#等实现.Hessian和Axis.XFire都能 ...