分享
 
 
 

用DTS实现SQL数据库的导入

王朝vb·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

在实际应用当中,我们经常需要对数据库进行导入导出的操作,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)

'以换行回车分隔行

.RowTerminator = vbCrLf

End With

oStep.TaskName = oCustomTask.Name

'添加包

With oPackage

.Steps.Add oStep

.Tasks.Add oTask

.FailOnError = True

End With

'运行包

oPackage.Execute

'释放

Set oConnection = Nothing

Set oCustomTask = Nothing

Set oTask = Nothing

Set oStep = Nothing

oPackage.UnInitialize

Set oPackage = Nothing

Exit Function

'以下是出错处理

PackageError:

Dim strMsg As String

strMsg = "Package failed error: " & ErrorNumConv(Err.Number) & _

vbCrLf & Err.Description & vbCrLf & AccumStepErrors(oPackage)

MsgBox strMsg, vbExclamation, oPackage.Name

Set oConnection = Nothing

Set oCustomTask = Nothing

Set oTask = Nothing

Set oStep = Nothing

oPackage.UnInitialize

Set oPackage = Nothing

Import_DTS = False

End Function

'以下是数据包与数据库的连接部分:

Private Sub SetConnections(oPackage As DTS.Package, oConnection As DTS.Connection)

With oConnection

.ConnectionProperties("Persist Security Info") = True

.ConnectionProperties("User ID") = strDBUser

.ConnectionProperties("Initial Catalog") = strDBName

.ConnectionProperties("Data Source") = strServerName

.Catalog = strDBName

.DataSource = sServerName

.UserID = strDBUser

.Password = strDBUserPsd

.ID = 1

.Reusable = True

.ConnectImmediate = False

.UseTrustedConnection = False

End With

oPackage.Connections.Add oConnection

Set oConnection = Nothing

End Sub

'以下是出错处理

Private Function ErrorNumConv(ByVal lngErrNum As Long) As String

If lngErrNum < 65536 And lngErrNum > -65536 Then

ErrorNumConv = "x" & Hex(lngErrNum) & ", " & CStr(lngErrNum)

Else

ErrorNumConv = "x" & Hex(lngErrNum) & ", x" & _

Hex(lngErrNum And -65536) & " + " & CStr(lngErrNum And 65535)

End If

End Function

Private Function AccumStepErrors(ByRef oPackage As DTS.Package) As String

Dim oStep As DTS.Step

Dim strMessage As String

Dim lngErrNum As Long

Dim strDescr As String

Dim strSource As String

'查找出错地

For Each oStep In oPackage.Steps

If oStep.ExecutionStatus = DTSStepExecStat_Completed Then

If oStep.ExecutionResult = DTSStepExecResult_Failure Then

'得到出错信息

oStep.GetExecutionErrorInfo lngErrNum, strSource, strDescr

strMessage = strMessage & vbCrLf & _

"Step " & oStep.Name & " failed, error: " & _

ErrorNumConv(lngErrNum) & vbCrLf & strDescr & vbCrLf

End If

End If

Next

AccumStepErrors = strMessage

End Function

以上代码在win2k pro + sql2k下调试通过。

本人在学习DTS的过程中参考了大量的SQL自带的sample代码,确实收获不小,特此撰文,给朋友们做为一点参考,我想在以后的时间里尽可能地多总结一下自己在学习应用过程中的心得体会,希望与大家多交流,也希望大家接受点批评指正。

minajo21(大眼睛)

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有