用DTS实现SQL数据库的导入
来源:互联网 发布:专业流程图软件 编辑:程序博客网 时间:2024/05/17 22:13
在实际应用当中,我们经常需要对数据库进行导入导出的操作,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(大眼睛)
- 用DTS实现SQL数据库的导入
- 用DTS实现SQL数据库的导入
- 写一个在程序中创建dts包,实现数据用dts导入到sql的类。
- 写一个在程序中创建dts包,实现数据用dts导入到sql的类
- sql anywhere 的unload和reload(数据迁移) 用微软sql server 的DTS实现从 ORACLE导出数据到Sql Anywhere数据库中
- SQL Server2005中利用dts将Oracle数据库导入到SQL Server2005
- SQL SERVER中利用dts将oracle数据库导入到SQL SERVER
- 用DTS方式实现数据导入导出操作
- 用DTS方式实现数据导入导出操作
- DTS for SQL 2005 Express(SQL 2005 Express 实现导入导出功能)
- 用DTS导入文件的两个小技巧
- 用DTS导入Excel文件的两个小技巧
- Sql Server 2005 Express数据库导入导出功能的实现
- Sql Server 2005 Express数据库导入导出功能的实现
- Sql Server 2005 Express数据库导入导出功能的实现
- mysql导入source数据库sql的C++实现和封装
- mysql导入source数据库sql的C++实现和封装
- [转载]利用SQL Server的DTS操作EXCEL、Access等数据表的导入导出
- 解析KJava在移动设备开发中的应用
- 建立一个程序员自己的全国性营销网络
- JDBC连接数据库经验技巧集萃
- 用VB语言编程实现JPEG数据压缩
- Struts应用系统案例设计编程讲解(2)
- 用DTS实现SQL数据库的导入
- vb实现多线程!
- Struts应用系统案例设计编程讲解(4)
- 以Oracle为例说明如何通过ODBC将数据库中的指定表导出
- Struts应用系统案例设计编程讲解(5)
- 在 VB 中使用 Unicode API
- Struts应用系统案例设计编程讲解(7)
- 基于VB6+ADO+ListView制作的一个数据库分页显示程序(
- 基于ADO+Adodc控件+DataGrid控件制作的一个数据库编辑