在公司做的软件中,每个月都需要把Excel表格中的数据导入数据库中,别的人员对数据库不懂,只能每次亲自用导入导出向导来导入数据,感觉很不方便,在网上查找了一下,发现使用SqlBulkCopys可以快速的导入大量的数据,方法如下:
把Excel数据上传到服务器中,并保存这个文件在服务器上的文件地址.
加载服务器上的Excel文件到DataTable对像中
使用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更新语句.方便简单.