必威注册电子书籍教程中心网文荟萃客户留言繁體中文
设为首页
加入收藏
联系必威注册
您当前的位置:92动力网 -> 教程中心 -> 编程经验 -> Visual Basic -> 教程内容 退出登录 用户管理
栏目导航
· Visual Basic· Delphi
· Visual C++· C++ Builder
· JAVA DotNet· 其他相关
热门教程
· 如何在Visual Basic...
· 使用Visual Basic操...
· 使用VB6.0设计Activ...
· VB动态调用外部函数...
· 建立一个程序员自己...
· 如何编写高质量的VB...
· [图文] 为更新到Visual Bas...
· 再谈在VB中调用VC++...
· 用VB语言编程实现JP...
· 用DTS实现SQL数据库...
相关教程

用DTS实现SQL数据库的导入
作者:佚名聽聽来源:本站整理聽聽发布时间:2005-12-25 18:57:17聽聽发布人:admin

减小字体 增大字体

聽聽聽聽在实际应用当中,我们经常需要对数据库进行导入导出的操作,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.Des cription & 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(大眼睛)聽聽


[] [返回上一页] [打 印] [收 藏]
上一篇教程:vb实现多线程!
∷相关教程评论∷    (评论内容只代表网友观点,与本站立场无关!) [更多评论...]
关于本站 - 网站帮助 - 广告合作 - 下载声明 - 网站地图 - 管理登录
Copyright 2019 必威注册. All Rights Reserved .
浙ICP备05047688号