亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

c#中高效的excel導入oracle的方法

2019-11-17 04:30:15
字體:
來源:轉載
供稿:網友

如何高效的將Excel導入到Oracle?和前兩天的SqlBulkCopy 導入到sqlserver對應,oracle也有自身的方法,只是稍微復雜些.
那就是使用oracle的sql*loader功能,而sqlldr只支持類似csv格式的數據,所以要自己把excel轉換一下。
實現步驟:
用com組件讀取excel-保存為csv格式-處理最后一個字段為null的情況和表頭-根據excel結構建表-生成sqlldr的控制文件-用sqlldr命令導入數據
這個性能雖然沒有sql的bcp快,但還是相當可觀的,在我機器上1萬多數據不到4秒,而且導入過程代碼比較簡單,也同樣沒有循環拼接sql插入那么難以維護。

這里也提個問題:處理csv文件的表頭和最后一個字段為null的情況是否可以優化?除了我代碼中的例子,我實在想不出其他辦法。

 

view plaincopy to clipboardPRint?
using System;  
using System.Data;  
using System.Text;  
using System.Windows.Forms;  
using Microsoft.Office.Interop.Excel;  
using System.Data.OleDb;  
//引用-com-microsoft excel objects 11.0  
namespace Windowsapplication5  
{  
    public partial class Form1 : Form  
    {  
        public Form1()  
        {  
            InitializeComponent();  
        }  
   
        /// <SUMMARY>  
        /// excel導入到oracle  
        /// </SUMMARY>  
        /// <PARAM name="excelFile">文件名</PARAM>  
        /// <PARAM name="sheetName">sheet名</PARAM>  
        /// <PARAM name="sqlplusString">oracle命令sqlplus連接串</PARAM>  
        public void TransferData(string excelFile, string sheetName, string sqlplusString)  
        {  
            string strTempDir = System.IO.Path.GetDirectoryName(excelFile);  
            string strFileName = System.IO.Path.GetFileNameWithoutExtension(excelFile);  
            string strCsvPath = strTempDir +"//"+strFileName + ".csv";  
            string strCtlPath = strTempDir + "http://" + strFileName + ".Ctl";  
            string strSqlPath = strTempDir + "http://" + strFileName + ".Sql";  
            if (System.IO.File.Exists(strCsvPath))  
                System.IO.File.Delete(strCsvPath);  
 
 
            //獲取excel對象  
            Microsoft.Office.Interop.Excel.Application ObjExcel = new Microsoft.Office.Interop.Excel.Application();  
 
            Microsoft.Office.Interop.Excel.Workbook ObjWorkBook;  
 
            Microsoft.Office.Interop.Excel.Worksheet ObjWorkSheet = null;  
 
            ObjWorkBook = ObjExcel.Workbooks.Open(excelFile, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);  
 
            foreach (Microsoft.Office.Interop.Excel.Worksheet sheet in ObjWorkBook.Sheets)  
            {  
                if (sheet.Name.ToLower() == sheetName.ToLower())  
                {  
                    ObjWorkSheet = sheet;  
                    break;  
                }  
            }  
            if (ObjWorkSheet == null) throw new Exception(string.Format("{0} not found!!", sheetName));  
 
 
            //保存為csv臨時文件  
            ObjWorkSheet.SaveAs(strCsvPath, Microsoft.Office.Interop.Excel.XlFileFormat.xlCSV, Type.Missing, Type.Missing, false, false, false, Type.Missing, Type.Missing, false);  
            ObjWorkBook.Close(false, Type.Missing, Type.Missing);  
            ObjExcel.Quit();  
 
            //讀取csv文件,需要將表頭去掉,并且將最后一列為null的字段處理為顯示的null,否則oracle不會識別,這個步驟有沒有好的替換方法?  
            System.IO.StreamReader reader = new System.IO.StreamReader(strCsvPath,Encoding.GetEncoding("gb2312"));  
            string strAll = reader.ReadToEnd();  
            reader.Close();  
            string strData = strAll.Substring(strAll.IndexOf("/r/n") + 2).Replace(",/r/n",",Null");  
 
            byte[] bytes = System.Text.Encoding.Default.GetBytes(strData);  
            System.IO.Stream ms = System.IO.File.Create(strCsvPath);  
            ms.Write(bytes, 0, bytes.Length);  
            ms.Close();  
 
 
            //獲取excel表結構  
            string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + excelFile + ";" + "Extended Properties=Excel 8.0;";  
            OleDbConnection conn = new OleDbConnection(strConn);  
            conn.Open();  
            System.Data.DataTable table = conn.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Columns,  
                new object[] { null, null, sheetName+"$", null });  
 
 
            //生成sqlldr用到的控制文件,文件結構參考sql*loader功能,本示例已逗號分隔csv,數據帶逗號的用引號括起來。     
            string strControl =  "load data/r/ninfile &apos;{0}&apos; /r/nappend into table {1}/r/n"+      
                  "FIELDS TERMINATED BY &apos;,&apos; OPTIONALLY ENCLOSED BY &apos;/"&apos;/r/n(";    
            strControl = string.Format(strControl, strCsvPath,sheetName);  
            foreach (System.Data.DataRow drowColumns in table.Select("1=1", "Ordinal_Position"))  
            {  
                strControl += drowColumns["Column_Name"].ToString() + ",";  
            }  
 
            strControl = strControl.Substring(0, strControl.Length - 1) + ")";  
            bytes=System.Text.Encoding.Default.GetBytes(strControl);  
            ms= System.IO.File.Create(strCtlPath);  
 
            ms.Write(bytes, 0, bytes.Length);  
            ms.Close();  
 
            //生成初始化oracle表結構的文件  
            string strSql = @"drop table {0};              
                  create table {0}   
                  (";  
            strSql = string.Format(strSql, sheetName);  
            foreach (System.Data.DataRow drowColumns in table.Select("1=1", "Ordinal_Position"))  
            {  
                strSql += drowColumns["Column_Name"].ToString() + " varchar2(255),";  
            }  
            strSql = strSql.Substring(0, strSql.Length - 1) + ");/r/nexit;";  
            bytes = System.Text.Encoding.Default.GetBytes(strSql);  
            ms = System.IO.File.Create(strSqlPath);  
 
            ms.Write(bytes, 0, bytes.Length);  
            ms.Close();  
 
 
            //運行sqlplus,初始化表  
            System.Diagnostics.Process p = new System.Diagnostics.Process();  
            p.StartInfo = new System.Diagnostics.ProcessStartInfo();  
            p.StartInfo.FileName = "sqlplus";  
            p.StartInfo.Arguments = string.Format("{0} @{1}", sqlplusString, strSqlPath);  
            p.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;  
            p.StartInfo.UseShellExecute = false;  
            p.StartInfo.CreateNoWindow = true;  
            p.Start();  
            p.WaitForExit();  
 
            //運行sqlldr,導入數據  
            p = new System.Diagnostics.Process();  
            p.StartInfo = new System.Diagnostics.ProcessStartInfo();  
            p.StartInfo.FileName = "sqlldr";  
            p.StartInfo.Arguments = string.Format("{0} {1}", sqlplusString, strCtlPath);  
            p.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;  
            p.StartInfo.RedirectStandardOutput = true;  
            p.StartInfo.UseShellExecute = false;  
            p.StartInfo.CreateNoWindow = true;  
            p.Start();  
            System.IO.StreamReader r = p.StandardOutput;//截取輸出流  
            string line = r.ReadLine();//每次讀取一行  
            textBox3.Text += line + "/r/n";  
            while (!r.EndOfStream)  
            {  
                line = r.ReadLine();  
                textBox3.Text += line + "/r/n";  
                textBox3.Update();  
            }  
            p.WaitForExit();  
 
            //可以自行解決掉臨時文件csv,ctl和sql,代碼略去  
        }  
 
        private void button1_Click(object sender, EventArgs e)  
        {  
            TransferData(@"D:/test.xls", "Sheet1", "username/passWord@servicename");  
        }  
          
    }  
}


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
538国产精品视频一区二区| 亚洲少妇激情视频| 国产大片精品免费永久看nba| 欧美韩日一区二区| 久久青草福利网站| 日韩a**中文字幕| 日韩欧美黄色动漫| 久久久久成人精品| 国产欧美日韩免费看aⅴ视频| 亚洲男女自偷自拍图片另类| 精品国产欧美成人夜夜嗨| 亚洲欧洲在线播放| 91影院在线免费观看视频| 亚洲自拍欧美色图| 国产精品久久久久久av| 91九色综合久久| 亚洲直播在线一区| 高跟丝袜一区二区三区| 日韩精品亚洲视频| 最新亚洲国产精品| 日本午夜在线亚洲.国产| 久久影院资源网| 久久久免费高清电视剧观看| 精品国产一区二区三区久久久狼| 欧美成人精品在线播放| 一个人看的www欧美| 最好看的2019年中文视频| 久久久午夜视频| 亚洲欧美日韩在线高清直播| 久久九九国产精品怡红院| 久久九九有精品国产23| 亚洲区bt下载| 自拍偷拍亚洲在线| 青青青国产精品一区二区| 久久久999成人| 国产精品入口尤物| 性日韩欧美在线视频| 91免费国产网站| 国产精品999999| 久久亚洲精品国产亚洲老地址| 精品国内自产拍在线观看| 欧美性生活大片免费观看网址| 欧美日韩视频免费播放| 亚洲精品美女久久久久| 成人精品aaaa网站| 在线日韩第一页| 久久99精品久久久久久青青91| 国内精品免费午夜毛片| 5252色成人免费视频| 国产亚洲精品一区二区| 欧美成人黑人xx视频免费观看| 成人精品一区二区三区电影免费| 国产精品九九久久久久久久| 久久色精品视频| 欧美丰满片xxx777| 黄色一区二区在线| 性欧美长视频免费观看不卡| 欧美电影第一页| 国产精品久久久久久久久久ktv| 美女黄色丝袜一区| 国产精品欧美日韩久久| 亚洲国产精品久久久久| 精品一区二区电影| 欧美高清不卡在线| 欧美影院在线播放| 亚洲美女自拍视频| 在线视频欧美性高潮| 亚洲成人黄色网| 精品国产乱码久久久久久天美| 中文字幕av一区二区| 亚洲va欧美va国产综合久久| 欧美视频专区一二在线观看| 日韩免费观看网站| 国产精品久久91| 日韩av黄色在线观看| 久久99热精品这里久久精品| 久久精品男人天堂| 韩国三级电影久久久久久| 欧美一级电影免费在线观看| 亚洲伊人第一页| 日韩美女免费线视频| 日韩精品免费电影| 亚洲一级免费视频| 国产精品欧美日韩| 欧美亚州一区二区三区| 国产精品久久久久久久电影| 97国产精品视频人人做人人爱| 久久亚洲一区二区三区四区五区高| 尤物九九久久国产精品的特点| 国产三级精品网站| 欧美日本在线视频中文字字幕| 国产精品视频专区| 国产成人av在线| 国产精品久久久亚洲| 欧美日韩精品在线观看| 亚洲a∨日韩av高清在线观看| 欧美高跟鞋交xxxxhd| 国产视频欧美视频| 亚洲日韩欧美视频一区| 亚洲欧洲美洲在线综合| 热99精品只有里视频精品| 国产精品久久网| 亚洲图片欧美日产| 日韩精品中文字幕在线观看| 久久久精品国产网站| 久久精品国产96久久久香蕉| 精品国产美女在线| 久久夜色精品亚洲噜噜国产mv| 51ⅴ精品国产91久久久久久| 亚洲第一精品夜夜躁人人躁| 国产精品老牛影院在线观看| 日本不卡高字幕在线2019| 亚洲人a成www在线影院| 美乳少妇欧美精品| 日本一欧美一欧美一亚洲视频| 欧美性极品xxxx娇小| 欧美成人免费播放| 国产欧美日韩最新| 国产精品91久久久久久| 91精品视频在线看| 日本一区二区在线免费播放| 精品久久久久久久大神国产| 北条麻妃久久精品| 久久人体大胆视频| 国产精品网址在线| 亚洲欧美一区二区三区情侣bbw| 久久久久久高潮国产精品视| 亚洲最新av在线网站| 国产成人在线一区二区| 亚洲国产三级网| 黄网站色欧美视频| 日韩中文av在线| 欧美成人第一页| 亚洲国产精品va在线看黑人动漫| 日本不卡高字幕在线2019| 久久视频在线直播| 国产精品高潮粉嫩av| 国产精品人人做人人爽| 国产午夜精品免费一区二区三区| 成人免费观看a| 中日韩美女免费视频网址在线观看| 欧美午夜电影在线| 日韩中文有码在线视频| 91免费人成网站在线观看18| 欧洲成人在线观看| 久久久999精品| 成人国产精品免费视频| 国产精品久久久久久久久久免费| 97色在线视频观看| 久久手机免费视频| 成人免费视频网| 国产日韩欧美黄色| 日韩精品在线观| 亚洲欧洲高清在线| 亚洲免费视频在线观看| www国产91| 午夜精品一区二区三区av| 精品国产一区二区三区在线观看| 国产精品国产亚洲伊人久久| 国产精品亚洲аv天堂网| 欧美一区二区大胆人体摄影专业网站| 中文字幕精品视频| 欧美性受xxxx白人性爽| 久久视频在线看|