99999久久久久久亚洲,欧美人与禽猛交狂配,高清日韩av在线影院,一个人在线高清免费观看,啦啦啦在线视频免费观看www

熱線電話:13121318867

登錄
首頁精彩閱讀將Excel數(shù)據(jù)快速大批量導(dǎo)入數(shù)據(jù)庫的代碼
將Excel數(shù)據(jù)快速大批量導(dǎo)入數(shù)據(jù)庫的代碼
2018-01-01
收藏

將Excel數(shù)據(jù)快速大批量導(dǎo)入數(shù)據(jù)庫的代碼

兩種途徑將數(shù)據(jù)從EXCEL中導(dǎo)入到SQL SERVER。
一、在程序中,用ADO.NET。代碼 如下:
//連接串

string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=Excel 8.0;Data Source=" + [EXCEL文件,含路徑] + ";";

OleDbConnection conn = new OleDbConnection(strConn);

conn.Open();

DataTable dtSchema = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables,new object[] {null, null, null, "TABLE"});

DataSet ds = new DataSet();

//一個EXCEL文件可能有多個工作表,遍歷之

foreach( DataRow dr in dtSchema.Rows )

{

   string table = dr["TABLE_NAME"].ToString();

   string strExcel = "SELECT * FROM [" + table + "]";

   ds.Tables.Add(table);

   OleDbDataAdapter myCommand = new OleDbDataAdapter(strExcel,conn);

   myCommand.Fill(ds,table);

}

conn.Close();

這樣,讀取出來的數(shù)據(jù)就藏在DataSet里了。

采用這種方式,數(shù)據(jù)庫 所在機器不必裝有EXCEL。

二、        在查詢分析器里,直接寫SQL語句:

如果是導(dǎo)入數(shù)據(jù)到現(xiàn)有表,則采用

INSERT INTO 表 SELECT * FROM OPENROWSET('MICROSOFT.JET.OLEDB.4.0'

,'Excel 5.0;HDR=YES;DATABASE=c:\test.xls',sheet1$)

的形式

如果是導(dǎo)入數(shù)據(jù)并新增表,則采用

SELECT * INTO 表 FROM OPENROWSET('MICROSOFT.JET.OLEDB.4.0'

,'Excel 5.0;HDR=YES;DATABASE=c:\test.xls',sheet1$)

的形式。

以上語句是將EXCEL文件里SHEET1工作表中所有的列都讀進(jìn)來,如果只想導(dǎo)部分列,可以

INSERT INTO 表(a1,a2,a3) SELECT a1,a2,a3 FROM OPENROWSET('MICROSOFT.JET.OLEDB.4.0'

,'Excel 5.0;HDR=YES;DATABASE=c:\test.xls',sheet1$)

其實可以將OPENROWSET('MICROSOFT.JET.OLEDB.4.0'

,'Excel 5.0;HDR=YES;DATABASE=c:\test.xls',sheet1$)當(dāng)成一個表,例如我就寫過這樣一個句子:

INSERT INTO eval_channel_employee(channel,employee_id)

SELECT CASE a.渠道 WHEN 'DIY' THEN 1 WHEN 'RDC' THEN 0 WHEN 'KCM' THEN 2 ELSE 3 END

,b.id FROM

OPENROWSET('MICROSOFT.JET.OLEDB.4.0'

,'Excel 5.0;HDR=YES;DATABASE=c:\temp\name.xls',sheet1$) AS a,pers_employee b
WHERE a.員工編碼=b.code
不管是哪種方式,哪種途徑,系統(tǒng)都會默認(rèn)將第一行上的內(nèi)容作為字段名。
在做項目時,經(jīng)常遇到要將Excel中的大量數(shù)據(jù)導(dǎo)入到Access數(shù)據(jù)庫中,原來的做法是讀一條寫一條,若導(dǎo)入上萬條的數(shù)據(jù)需要幾分仲時間,速度很慢。有沒有最快的方法呢?經(jīng)本人研究、反復(fù)的實驗,終于寫出了最快速的批量導(dǎo)入大批量數(shù)據(jù)的方法,上萬條數(shù)據(jù)只需幾秒鐘就可全部導(dǎo)入,夠快了吧。代碼公布出來與大家分享。
Sql代碼
Set  conn = Server.CreateObject( "adodb.Connection" )   
connstr =  "Provider=Microsoft.Jet.OLEDB.4.0; Data source="  & Server.MapPath( "test.mdb" )   
conn. Open  connstr   
sql =  "insert into userinfo select userName,userAccount,userStatus from [userinfo$] in '"  & Server.MapPath( "hbwlUserInfo.xls" )   
&  "' 'Excel 8.0;' where userAccount is not null"   
conn. Execute  (sql)  

SQL Server
  大部分人都知道用oledb來讀取數(shù)據(jù)到dataset,但是讀取之后怎么處理dataset就千奇百怪了。很多人通過循環(huán)來拼接sql,這樣做不但容易出錯而且效率低下,System.Data.SqlClient.SqlBulkCopy 對于新手來說還是比較陌生的,這個就是傳說中效率極高的bcp,6萬多數(shù)據(jù)從excel導(dǎo)入到sql只需要4.5秒。 
using  System;
using  System.Data;
using  System.Windows.Forms;
using  System.Data.OleDb;
namespace  WindowsApplication2
{
      public   partial   class  Form1 : Form
      {
          public  Form1()
          {
             InitializeComponent();
         } 

          private   void  button1_Click( object  sender, EventArgs e)
          {
              // 測試,將excel中的sheet1導(dǎo)入到sqlserver中 
              string  connString  =   " server=localhost;uid=sa;pwd=sqlgis;database=master " ;
             System.Windows.Forms.OpenFileDialog fd  =   new  OpenFileDialog();
              if  (fd.ShowDialog()  ==  DialogResult.OK)
              {
                 TransferData(fd.FileName,  " sheet1 " , connString);
             } 
         } 

          public   void  TransferData( string  excelFile,  string  sheetName,  string  connectionString)
          {
             DataSet ds  =   new  DataSet();
              try 
              {
                  // 獲取全部數(shù)據(jù) 
                  string  strConn  =   " Provider=Microsoft.Jet.OLEDB.4.0; "   +   " Data Source= "   +  excelFile  +   " ; "   +   " Extended Properties=Excel 8.0; " ;
                 OleDbConnection conn  =   new  OleDbConnection(strConn);
                 conn.Open();
                  string  strExcel  =   "" ;
                 OleDbDataAdapter myCommand  =   null ;
                 strExcel  =   string .Format( " select * from [{0}$] " , sheetName);
                 myCommand  =   new  OleDbDataAdapter(strExcel, strConn);
                 myCommand.Fill(ds, sheetName);

                  // 如果目標(biāo)表不存在則創(chuàng)建 
                  string  strSql  =   string .Format( " if object_id('{0}') is null create table {0}( " , sheetName);
                  foreach  (System.Data.DataColumn c  in  ds.Tables[ 0 ].Columns)
                  {
                     strSql  +=   string .Format( " [{0}] varchar(255), " , c.ColumnName);
                 } 
                 strSql  =  strSql.Trim( & apos;, & apos;)  +   " ) " ;

                  using  (System.Data.SqlClient.SqlConnection sqlconn  =   new  System.Data.SqlClient.SqlConnection(connectionString))
                  {
                     sqlconn.Open();
                     System.Data.SqlClient.SqlCommand command  =  sqlconn.CreateCommand();
                     command.CommandText  =  strSql;
                     command.ExecuteNonQuery();
                     sqlconn.Close();
                 } 
                  // 用bcp導(dǎo)入數(shù)據(jù) 
                  using  (System.Data.SqlClient.SqlBulkCopy bcp  =   new  System.Data.SqlClient.SqlBulkCopy(connectionString))
                  {
                     bcp.SqlRowsCopied  +=   new  System.Data.SqlClient.SqlRowsCopiedEventHandler(bcp_SqlRowsCopied);
                     bcp.BatchSize  =   100 ; // 每次傳輸?shù)男袛?shù) 
                     bcp.NotifyAfter  =   100 ; // 進(jìn)度提示的行數(shù) 
                     bcp.DestinationTableName  =  sheetName; // 目標(biāo)表 
                     bcp.WriteToServer(ds.Tables[ 0 ]);
                 } 
             } 
              catch  (Exception ex)
              {
                 System.Windows.Forms.MessageBox.Show(ex.Message);
             } 

         } 

          // 進(jìn)度顯示 
          void  bcp_SqlRowsCopied( object  sender, System.Data.SqlClient.SqlRowsCopiedEventArgs e)
          {
              this .Text  =  e.RowsCopied.ToString();
              this .Update();
         } 


     } 
}  
  上面的TransferData基本可以直接使用,如果要考慮周全的話,可以用oledb來獲取excel的表結(jié)構(gòu),并且加入ColumnMappings來設(shè)置對照字段,這樣效果就完全可以做到和sqlserver的dts相同的效果了。

記錄備忘
二快速導(dǎo)入導(dǎo)出
1.我們都知道當(dāng)向db里批量插入數(shù)據(jù)的時候我們會選擇SqlBulkCopy
if (dataTable!=null && dataTable.Rows.Count!=0)
            {
                sqlBulkCopy.WriteToServer(dataTable);
            } 
這個可以看 深山老林新發(fā)的一篇SQLServer中批量插入數(shù)據(jù)方式的性能對比下面是SqlBulkCopy的方法,這個方法有一個弊端就是當(dāng)excel某一列即有文字,還有日期的時候,會出現(xiàn)null值,我在網(wǎng)上查了一些資料說連接字串加上;HDR=YES;IMEX=1'的時候會都當(dāng)做字符處理,但是還是會出現(xiàn)一些bug,所以建議最好先把excel數(shù)據(jù)分析到datatable里然后再用SqlBulkCopy倒入數(shù)據(jù)庫
1 // block copy to DB from Excel
2         //By xijun, 
3         //step 1 create an excel file  C:\Inetpub\wwwroot\test.xls , fill cell(1,1) with "Data",cell(1,2) with "name"
4         //step 2 create table named "Data" with 2 column ("data","name") in your DB
5         //there the code below:
6         DateTime t1 = DateTime.Now;
7         Response.Write("<br>start time:" + t1.ToString());
8         string ExcelFile = @"C:\\20090916_Hub_Report.xls";
9         string excelConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + ExcelFile + ";Extended Properties='Excel 8.0;HDR=YES;IMEX=1'";
10 
11         using (OleDbConnection excelConnection = new OleDbConnection(excelConnectionString))
12         {
13 
14             excelConnection.Open();
15             //Getting source data
16             //非空讀入數(shù)據(jù)
17             OleDbCommand command = new OleDbCommand("Select [Region],[CustomerPN],[RMA],[Date],[QTY],[Return/Pull] FROM [20090916_Hub_Report$]  ", excelConnection);
18             // Initialize SqlBulkCopy object
19 
20             using (OleDbDataReader dr = command.ExecuteReader())
21             {
22                 // Copy data to destination
23                 string sqlConnectionString = @"Data Source=MININT-G87PHNA\SQLEXPRESS;Initial Catalog=GDS_Service;Integrated Security=True";
24                 using (SqlBulkCopy bulkCopy = new SqlBulkCopy(sqlConnectionString))
25                 {
26                     bulkCopy.DestinationTableName = "GDS_Hub_data";
27                     //加入只加入一個列的話,那么就會其他數(shù)據(jù)庫列都默認(rèn)為空。
28                     bulkCopy.ColumnMappings.Add("Region", "region");
29                     bulkCopy.ColumnMappings.Add("CustomerPN", "customer_item_number");
30                     bulkCopy.ColumnMappings.Add("RMA", "Rma");
31                     bulkCopy.ColumnMappings.Add("Date", "date");
32                     bulkCopy.ColumnMappings.Add("QTY", "Qty_1");
33                     bulkCopy.ColumnMappings.Add("Return/Pull", "return_pull");
34                     //bcp.BatchSize = 100;//每次傳輸?shù)男袛?shù)
35                     //bcp.NotifyAfter = 100;//進(jìn)度提示的行數(shù)
36                     bulkCopy.BatchSize = 100;
37                     bulkCopy.NotifyAfter = 100;
38                     bulkCopy.WriteToServer((IDataReader)dr);
39                     
40 
41                 }
42             }
43             //Closing connection
44             excelConnection.Close();
45         }
46 
47         DateTime t2 = DateTime.Now;
48         Response.Write("<br>End time:" + t2.ToString());
49         Response.Write("<br>use time:" + ((TimeSpan)(t2 - t1)).Milliseconds.ToString() + " Milliseconds");
50         Response.Write("<br>inser record count :3307");


數(shù)據(jù)分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數(shù)據(jù)分析師資訊
更多

OK
客服在線
立即咨詢
客服在線
立即咨詢
') } function initGt() { var handler = function (captchaObj) { captchaObj.appendTo('#captcha'); captchaObj.onReady(function () { $("#wait").hide(); }).onSuccess(function(){ $('.getcheckcode').removeClass('dis'); $('.getcheckcode').trigger('click'); }); window.captchaObj = captchaObj; }; $('#captcha').show(); $.ajax({ url: "/login/gtstart?t=" + (new Date()).getTime(), // 加隨機數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調(diào)用 initGeetest 進(jìn)行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調(diào),回調(diào)的第一個參數(shù)驗證碼對象,之后可以使用它調(diào)用相應(yīng)的接口 initGeetest({ // 以下 4 個配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺檢測極驗服務(wù)器是否宕機 new_captcha: data.new_captcha, // 用于宕機時表示是新驗證碼的宕機 product: "float", // 產(chǎn)品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說明請參見:http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計時完成 $(".getcheckcode").removeClass('dis').html("重新獲取"); }else{ $(".getcheckcode").addClass('dis').html("重新獲取("+_wait+"s)"); _wait--; setTimeout(function () { codeCutdown(); },1000); } } function inputValidate(ele,telInput) { var oInput = ele; var inputVal = oInput.val(); var oType = ele.attr('data-type'); var oEtag = $('#etag').val(); var oErr = oInput.closest('.form_box').next('.err_txt'); var empTxt = '請輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請輸入正確的'+oInput.attr('placeholder')+'!'; var pattern; if(inputVal==""){ if(!telInput){ errFun(oErr,empTxt); } return false; }else { switch (oType){ case 'login_mobile': pattern = /^1[3456789]\d{9}$/; if(inputVal.length==11) { $.ajax({ url: '/login/checkmobile', type: "post", dataType: "json", data: { mobile: inputVal, etag: oEtag, page_ur: window.location.href, page_referer: document.referrer }, success: function (data) { } }); } break; case 'login_yzm': pattern = /^\d{6}$/; break; } if(oType=='login_mobile'){ } if(!!validateFun(pattern,inputVal)){ errFun(oErr,'') if(telInput){ $('.getcheckcode').removeClass('dis'); } }else { if(!telInput) { errFun(oErr, errTxt); }else { $('.getcheckcode').addClass('dis'); } return false; } } return true; } function errFun(obj,msg) { obj.html(msg); if(msg==''){ $('.login_submit').removeClass('dis'); }else { $('.login_submit').addClass('dis'); } } function validateFun(pat,val) { return pat.test(val); }