在实际应用当中,我们经常需要对数据库进行导入导出的操作,sql自带的dts向导应该说是很方便的工具,但是有的时候这种导入的操作是要求客户自己来完成的,这样就要求我们在代码中实现这种功能,而且根据实际需要,操作要更加友好。下面就以vb+sql为例,根据本人的一点经验,做一些简单的介绍。
1. 原文档的提供
实际当中,最常用的两种格式是txt、xls,即文本文件和excel文件。
1.1 文本文件
文本文件在导入的时候最要注意的就是行与列的分隔,即用什么来区分行、列,从而与数据库中的目标表中的字段来进行对应。一般说来,分隔行,一般用回车、换行符,而列则一般可用tab、","、";"、"|"等符号。
1.2 excel文件
excel文件和数据库中的表,有以下的对应关系
excel table
"sheet name" "table"
"a1" "field name 1"
"b2" "field name 2"
...
另外要注意的是,在导入时,无论文本文件或是excel文件,第一行都是可选做目标表的字段名的。
2. 导入数据的方法
如果你愿意,完全可以用代码来控制,实现从文本文件或excel文件一条一条地读出数据,然后在一条一条地insert到表中。但这显然是不能满足大量数据的导入的。在实际当中,比较常用的有:sql的opendatasource方式,bcp方式,以及dts方式等等,各有各的特点。
3. 示例
由于篇幅等的限制,下面仅举一个用dts导入文本文件的例子。(如果你缺少点dts的基础知识,请先参阅一下这方面的介绍)
假设文本文件名为test.txt,其中的数据格式为:
0001 anna maltelli
0002 maria shearer
0003 shanda carroll
...
我们首先分析,这个文件是以tab来分隔列,以(cr)(lf)来分隔行的。
以下是一个sql目标数据库的一些信息:
private strservername as string 'server name
private strdbname as string 'database name
private strdbuser as string 'database user name
private strdbuserpsd as string 'database user password
这些变量假设在次之前都已经正确的附值了,在下面的代码中就直接用了
下面开始动手:
引用:microsoft dtspackage object library
下面是完成数据导入的主function。
进参:文本文件的路径及文件名
返回:成功,true
失败,false 及 错误号
private function import_dts(strpath as string) as boolean
dim oconnection as dts.connection
dim ostep as dts.step
dim otask as dts.task
dim opackage as dts.package2
dim ocustomtask as dts.bulkinserttask
on error goto packageerror
import_dts = true
'建立数据包
set opackage = new dts.package
opackage.failonerror = true
set oconnection = opackage.connections.new("sqloledb")
set ostep = opackage.steps.new
set otask = opackage.tasks.new("dtsbulkinserttask")
set ocustomtask = otask.customtask
'与数据库进行连接,为了清楚起见,这里我单独写了一个过程,即 setconnections
'具体可以参考private sub setconnections
setconnections opackage, oconnection
with ostep
.name = "genericpkgstep"
.executeinmainthread = true
end with
'customize the task object
with ocustomtask
.name = "genericpkgtask"
'文本文件的路径
.datafile = strpath
.connectionid = 1
'注意目标表的写法
.destinationtablename = strdbname & "..drivername"
'以tab分隔列
.fieldterminator = vba.chr(9)