2011年8月4日 星期四

[ASP.NET] 使用SqlBulkCopy把Excel的資料匯入SQL Sever

有時有些客戶會要求,希望他可以把他以前的資料用Excel匯入資料庫中,
如果是一筆一筆新增的話,在網站是非常耗效能的,
在資料庫這一來一往的開關,會耗掉非常多效能,
當資料量小時也許沒有差別,但當資料是上萬筆以上,這樣一開一關就非常的耗效能了,
ADO.NET 2.0以上提供了SqlBulkCopy這個類別可以方便的把大量的資料複製,
SqlBulkCopy的詳細內容可以參考MSDN上的說明 (詳細),

在資料庫中我範例的SQL Script如下:

CREATE TABLE [dbo].[ExcelData](
    [id] [int] NOT NULL,
    [name] [nvarchar](50) COLLATE Chinese_Taiwan_Stroke_CI_AS NULL,
    [email] [nvarchar](50) COLLATE Chinese_Taiwan_Stroke_CI_AS NULL,
CONSTRAINT [PK_ExcelData] PRIMARY KEY CLUSTERED
(
    [id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]


在這邊有兩點需要注意的地方,
(1)有黃底的這些欄位是跟資料庫對應的欄位
(2)Excel頁籤是再匯入時的table名稱,需要加上$字號,如ExcelData$

範例:
<%@ Page Language="VB" AutoEventWireup="false" CodeFile="test_BulkCopy.aspx.vb" Inherits="test_BulkCopy" %> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title>Excel的資料匯入SQL Sever</title> 
</head> 
<body> 
    <form id="form1" runat="server"> 
    <div> 
        <asp:Button ID="btnImport" runat="server" Text="匯入" /> 
    </div> 
    </form> 
</body> 
</html>

Imports System 
Imports System.Collections.Generic 
Imports System.IO 
Imports System.Web.UI 
Imports System.Text 
Imports System.Web.Configuration 
Imports System.Data 
Imports System.Data.SqlClient 
Imports System.Data.OleDb 
Imports System.Data.Common 
Imports System.Web.Security 
Imports System.Web.UI.HtmlControls 
Partial Class test_BulkCopy 
    Inherits System.Web.UI.Page 
    Friend Sub ImportDB() 
        'Excel檔案的實體路徑 
        Dim ExcelPath As String = "D:\TEST\test.xls" 
        'Excel的OLEDB ConnectionString 
        Dim ExcelConnectionString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & ExcelPath & ";Extended Properties=""Excel 8.0;HDR=YES;IMEX=1""" 
        Dim ExcelCn As New OleDbConnection(ExcelConnectionString) 
        Dim ExcelCmd As New OleDbCommand 
        Dim ExcelDr As DbDataReader 
        ExcelCmd.CommandText = "Select id,name,email from [ExcelData$]"  '抓取Excel資料的SQL指令 
        ExcelCmd.CommandType = CommandType.Text 
        ExcelCmd.Connection = ExcelCn 
        ExcelCmd.Connection.Open() 
        ExcelDr = ExcelCmd.ExecuteReader(CommandBehavior.CloseConnection) 
        Dim cn As New SqlConnection '設定資料庫Connect物件       
        '設定資料庫Connection連接 
        cn.ConnectionString = ConfigurationManager.ConnectionStrings("test_conndb").ConnectionString 
        cn.Open() 
        Dim BulkCopy As New SqlBulkCopy(cn) '宣告SqlBulkCopy物件 
        BulkCopy.DestinationTableName = "ExcelData" '定義要匯入的資料庫Table 
        BulkCopy.WriteToServer(ExcelDr) '寫入資料 
        ExcelDr.Close() 
        ExcelCmd.Dispose() 
        ExcelCn.Dispose() 
        cn.Dispose() 
    End Sub 
   
    Protected Sub btnImport_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnImport.Click 
        ImportDB() 
    End Sub 
End Class






沒有留言:

張貼留言