excel表格通过SqlBulkCopy导入数据库

在公司做的软件中,每个月都需要把Excel表格中的数据导入数据库中,别的人员对数据库不懂,只能每次亲自用导入导出向导来导入数据,感觉很不方便,在网上查找了一下,发现使用SqlBulkCopys可以快速的导入大量的数据,方法如下:

  1. 把Excel数据上传到服务器中,并保存这个文件在服务器上的文件地址.

  2. 加载服务器上的Excel文件到DataTable对像中

  3. 使用SqlBulkCopy把DataTable中的数据内容保存到数据库对应的表中.

需要注意的是DataTable对像中的列顺序和列类型要和数据库表的一致才可以正确导入,如果有数据类型错误则导入失败.如果有自增列如ID,在DataTable中也要有这列,只是不用赋于数据.数据库中的表需要设置个主键.否则无法导入.

我的数据库中的表名称为:临时可删除表,列有id,日期,姓名



Imports System.Data

Imports System.Data.SqlClient

Imports System.Data.OleDb


'根据传入的服务器上的Excel文件路径生成DataSet

 Function GetExcelData(ByVal Fname As String) As DataSet

        Dim ds As DataSet = New DataSet

        Dim filepath As String = Fname

        Dim conn As OleDbConnection

        Dim myAd As OleDbDataAdapter

        Dim connstr As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + filepath + ";Extended Properties=Excel 8.0;"

        Dim sql As String = "SELECT * FROM [Sheet1$]"

        Dim fileExt As String = System.IO.Path.GetExtension(filepath).ToLower()

        If fileExt = ".xlsx" Then

            connstr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + filepath + ";Extended Properties='Excel 12.0;HDR=YES'"

        End If

        conn = New OleDbConnection(connstr)

        myAd = New OleDbDataAdapter(sql, conn)

        myAd.Fill(ds)

        myAd.Dispose()

        conn.Close()

        Return ds

    End Function


在按钮事件中把表格数据导入数据库

            Dim Fname As String = H_name.Text   'Excel在服务器上的地址

            Dim constr As String = hr.GetStr    '连接数据库的sql字符串

            Dim dt As DataTable = New DataTable

            Dim sbc As SqlBulkCopy = New SqlBulkCopy(constr)

           


            dt = GetExcelData(Fname).Tables(0)   '把数据填充中到Dt中

            DG_show.DataSource = dt              '用于在用户界面显示dt中的数据,不是必需的

            DG_show.DataBind()

            sbc.BulkCopyTimeout = 5000

            sbc.NotifyAfter = dt.Rows.Count

            sbc.DestinationTableName = "临时可删除表"    '数据库中要导入的表的名称

            sbc.WriteToServer(dt)                        '把数据写入数据库.

第一次导入时提示string类型无法转换成日期类型的,原来是表格中没有ID列,增加这一列后就只接导入了,此种方法比用按行循环取DataTable然后insert into的效率要高很多,也不用写sql更新语句.方便简单.

你可能感兴趣的:(数据库,SqlBulkCopy,excel表格)