首页 > 数据库技术 > 详细

Excel大数据量分段导入到Oracle

时间:2014-03-11 02:09:16      阅读:697      评论:0      收藏:0      [点我收藏+]

 客户需要将一个具有2W多条数据的Excel表格中的数据导入到Oracle数据库的A表中,开始采用的是利用Oledb直接将数据读入到DataTable中,然后通过拼接InserInto语句来插入到数据库表A中.然后做好以后,发现经常提示Invalidate Character错误.但是将拼接好的SQL拿到PLSQL中执行,一切完好.最后没办法,为了缩小错误范围,开始利用begin end分段来做.具体方式为:

每隔1000条数据,加上形如   Begin  ...这里是1000条数据...   End;Commit;  的标记

具体后台代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
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,布布扣,bubuko.com

Excel大数据量分段导入到Oracle

原文:http://www.cnblogs.com/shangshen/p/3592229.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!