高分求vb的ftp整体解决方案 需求描述:将网点数据库的数据上传到总公司数据库中。(其中:1总公司用的是shh协议,分公司用的是ftp协议;2.数据有可能是网点直接上到总公司,也有可能是网点到分公司再到总公司,这个由下面的网络而定)对于网点直接上到总公司我目前的实现是:将网点数据库的数据导出成文件,然后生成脚本来调psftp软件上传文件到总公司;但是这个方法无法判断文件上传的完整性,也就是不能确保成功与否 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 在一个地方见过。http://hackcode.net/Article/html/HackCode862.html Visual Basic 作为一个集应用程序开发、测试、查错功能于一 体的集成式开发环境,越来越受到程序员的青睐。笔者在开发某数据 库维护系统的过程中,选择了VB5.0作为开发平台,Unix作为服务器端 操作系统,Informix 作为服务器数据库。 问题的出现 在开发该维护系统的过程中,注意到Informix 数据库的字段 类型CLOB 填入数据时需要函数FILETOCLOB("FILENAME","SERVER") , 其中的"FILENAME"需要指出文件路径和文件名称。然而,在维护过程 中此文件是在客户端执行的,这样就要求即时将文件传输到服务器端 。 解决办法 1. FTP传输工具 我们首先使用FTP传输工具,用VB5.0中SHELL 命令调用DOS批处理 文件来实现传输的需要。 Shell调用格式: Shell(pathname[,windowstyle]) 例子:Shell("c:\windows\upload.bat") 批处理文件upload.bat 的内容: c:\windows\ftp hostname username password send c:\zrh\upload.txt upload.txt bye 该命令实现了文件"upload.txt"的传输要求。在使用完毕之后, 再调用命令把该文件删除。 例子:Shell("c:\windows\del_up.bat") 批处理文件del_up.bat 的内容: c:\windows\ftp hostname username password dele upload.txt bye 这样,文件"upload.txt"被删除。 但是,另一个问题出现了。由于Shell 函数的运行机制是与其它 程序同步执行,也就是说,当调用Shell 函数的子程序还没有执行完毕 之前,Shell函数后面的语句已经执行。在大批量添加数据的过程中, 就会出现某个记录的文件还没有传到,而下一个插入语句(I nsert)已 经开始调用。这样,ODBC调用就会出现错误。 2. INET 控件 Internet Transfer控件提供了Internet 上最常使用的两种协议 :HTTP 和FTP。使用HTTP 协议可以连接到WWW服务器上来下载文件;使 用FTP协议则可以登录到FTP 服务器。一般的FTP命令,例如CD、GET 都可以通过Execute 方法实现。 下面是一个设置INET控件属性的例子。 inet1.URL=ftp://username:password@hostname/document inet1.Protocol=2-icFTP inet1.RemoteHost=hostname inet1.RemotePort=21 inet1.Username=username inet1. Password=password 执行文件传输: Inet1.Execute "ftp://username:password@hostname", _ "PUT" &local_filename & " UPLOAD1.TXT" right1 = Inet1.StillExecuting Do While right1 right1 = Inet1.StillExecuting DoEvents Loop 这样便实现了文件的上载。 *SINET 控件的优点 INET控件与Shell()函数的不同之处在于INET控件通过调用语句 right1 = Inet1.StillExecuting Do While right1 right1 = Inet1.StillExecuting DoEvents Loop来控制语句执行的顺序。在文件传输工作未完成之前,程序 不会执行其它语句,自然也就不会出现调用Shell 函数所出现的问题 。变量right1用来测试inet1 的执行状态,如果进程中仍在进行文件 传输的工作,则调用过程DoEvents给系统空闲时间来做文件传输工作, 这样便成功地执行了文件上载的功能。该文件使用完毕之后将被删除 。 Inet1.Execute "ftp://informix:informix@rd", _ "DELETE UPLOAD1.TXT" right1 = Inet1.StillExecuting Do While right1 right1 = Inet1.StillExecuting DoEvents Loop 将上载的文件删除是为了避免占用服务器端磁盘空间。 *S利用StateChanged事件提示信息 服务器在执行inet1.execute 的同时也激活了Inet1_StateChang ed事件,进程可以根据捕获到的状态进行动作。 object_StateChanged(ByVal State As Integer) State:整数类型Integer 下面是状态的说明。 常数值 描述icNone 0 未报告状态icHostResolvingHost 1 控件正在寻找指定主机的IP地址icHostResolved 2 控件已成功找到指定主机的IP地址icConnecting 3 控件正在与指定主机进行连接icConnected 4 控件已成功与指定主机连接icRequesting 5 控件正在向主机发出请求icRequestSent 6 控件已成功向主机发出请求icReceivingResponse 7 控件正在从主机接收反馈信息icResponseReceived 8 控件已成功从主机接受反馈信息icDisconnecting 9 控件正在与主机断开icDisconnected 10 控件已与主机断开icError 11 在与主机通信的过程中发生了错误icResponseComp leted 12 请求结束且数据已经接收到 下面是一个例子。 Private Sub Inet1_StateChanged(ByVal State As Integer) ' Retrieve server response using the GetChunk ' method when State = 12. This example assumes the ' data is text. Select Case State ' ... Other cases not shown. Case icResponseReceived ' 12 Dim vtData As Variant ' Data variable. Dim strData As String: strData = "" Dim bDone As Boolean: bDone = False ' Get first chunk. 直接用SQL Server的数据同步功能不好吗? to (gvzjbge2) :您的是针对ftp传输的,这个在我从站点传输到分公司有用到。顺便问一句,inet能判断文件传输是否成功吗?例如传输一半网络断开的问题如何捕获状态?另外,我在提问中的要求是sftp(shh协议),用inet控件是无法实现连接的,这个有什么好的方案?? to zhao4zhong1:我在站点用的是mysql数据库,在总公司用的是oracle数据库我现在是通过文件的导出、上传、导入的方法实现现在的问题是无法确保文件传输的完整性 没有高手给解决方案吗?要不然我出1krmb好了 钱拿来因为文件总是逐个传送的,所以你可以每传输一个数据文件后再传输一个确认文件。比如 20100423164205.dat 和 20100423164205.x,确认文件 20100423164205.x 零长度即可。接收端只有存在 20100423164205.x 的情况下,才认为数据文件 20100423164205.dat 是完整的。 发送端的成功与否,发送软件调用 ftp 时可以知道的,就看它能不能发发送结果返回给你。 to vb老鸟:从你的两个文件我突然得到点什么启发了 弟刚学VB一个学期,学校让做课程设,用VB连access做学生信息管理系统 判断选择的路径是否包含 某些字符 vb如何进行位操作 VB 关闭excel进程问题 请高手帮我解决个小问题 关于ADO连接数据库字符串的问题大家讨论一个那个速度更快一点 自定义的类中出现错误如何不致使调用的程序被中断(在线等候) insert into 语句语法错误,怪问题!!大家来看看那儿错了? CRectTracker 怪事,高手请进。 手机被偷了,想买个便宜的,请问如何防奸商作假 动画能否指定宏程序? 关于vb6的datagrid控件问题
Visual Basic 作为一个集应用程序开发、测试、查错功能于一 体的集成式开发环境,越来越受到程序员的青睐。笔者在开发某数据 库维护系统的过程中,选择了VB5.0作为开发平台,Unix作为服务器端 操作系统,Informix 作为服务器数据库。
问题的出现
在开发该维护系统的过程中,注意到Informix 数据库的字段 类型CLOB 填入数据时需要函数FILETOCLOB("FILENAME","SERVER") , 其中的"FILENAME"需要指出文件路径和文件名称。然而,在维护过程 中此文件是在客户端执行的,这样就要求即时将文件传输到服务器端 。
解决办法
1. FTP传输工具
我们首先使用FTP传输工具,用VB5.0中SHELL 命令调用DOS批处理 文件来实现传输的需要。
Shell调用格式:
Shell(pathname[,windowstyle])
例子:Shell("c:\windows\upload.bat")
批处理文件upload.bat 的内容:
c:\windows\ftp hostname
username
password
send c:\zrh\upload.txt upload.txt
bye
该命令实现了文件"upload.txt"的传输要求。在使用完毕之后, 再调用命令把该文件删除。
例子:Shell("c:\windows\del_up.bat")
批处理文件del_up.bat 的内容:
c:\windows\ftp hostname
username
password
dele upload.txt
bye
这样,文件"upload.txt"被删除。
但是,另一个问题出现了。由于Shell 函数的运行机制是与其它 程序同步执行,也就是说,当调用Shell 函数的子程序还没有执行完毕 之前,Shell函数后面的语句已经执行。在大批量添加数据的过程中, 就会出现某个记录的文件还没有传到,而下一个插入语句(I nsert)已 经开始调用。这样,ODBC调用就会出现错误。
2. INET 控件
Internet Transfer控件提供了Internet 上最常使用的两种协议 :HTTP 和FTP。使用HTTP 协议可以连接到WWW服务器上来下载文件;使 用FTP协议则可以登录到FTP 服务器。一般的FTP命令,例如CD、GET 都可以通过Execute 方法实现。
下面是一个设置INET控件属性的例子。
inet1.URL=ftp://username:password@hostname/document
inet1.Protocol=2-icFTP
inet1.RemoteHost=hostname
inet1.RemotePort=21
inet1.Username=username
inet1. Password=password
执行文件传输:
Inet1.Execute "ftp://username:password@hostname", _
"PUT" &local_filename & " UPLOAD1.TXT"
right1 = Inet1.StillExecuting
Do While right1
right1 = Inet1.StillExecuting
DoEvents
Loop
这样便实现了文件的上载。
*SINET 控件的优点
INET控件与Shell()函数的不同之处在于INET控件通过调用语句
right1 = Inet1.StillExecuting
Do While right1
right1 = Inet1.StillExecuting
DoEvents
Loop来控制语句执行的顺序。在文件传输工作未完成之前,程序 不会执行其它语句,自然也就不会出现调用Shell 函数所出现的问题 。变量right1用来测试inet1 的执行状态,如果进程中仍在进行文件 传输的工作,则调用过程DoEvents给系统空闲时间来做文件传输工作, 这样便成功地执行了文件上载的功能。该文件使用完毕之后将被删除 。
Inet1.Execute "ftp://informix:informix@rd", _
"DELETE UPLOAD1.TXT"
right1 = Inet1.StillExecuting
Do While right1
right1 = Inet1.StillExecuting
DoEvents
Loop
将上载的文件删除是为了避免占用服务器端磁盘空间。
*S利用StateChanged事件提示信息
服务器在执行inet1.execute 的同时也激活了Inet1_StateChang ed事件,进程可以根据捕获到的状态进行动作。
object_StateChanged(ByVal State As Integer)
State:整数类型Integer
下面是状态的说明。
常数值 描述icNone
0 未报告状态icHostResolvingHost
1 控件正在寻找指定主机的IP地址icHostResolved
2 控件已成功找到指定主机的IP地址icConnecting
3 控件正在与指定主机进行连接icConnected
4 控件已成功与指定主机连接icRequesting
5 控件正在向主机发出请求icRequestSent
6 控件已成功向主机发出请求icReceivingResponse
7 控件正在从主机接收反馈信息icResponseReceived
8 控件已成功从主机接受反馈信息icDisconnecting
9 控件正在与主机断开icDisconnected
10 控件已与主机断开icError
11 在与主机通信的过程中发生了错误icResponseComp leted
12 请求结束且数据已经接收到
下面是一个例子。
Private Sub Inet1_StateChanged(ByVal State As Integer)
' Retrieve server response using the GetChunk
' method when State = 12. This example assumes the
' data is text.
Select Case State
' ... Other cases not shown.
Case icResponseReceived ' 12
Dim vtData As Variant ' Data variable.
Dim strData As String: strData = ""
Dim bDone As Boolean: bDone = False
' Get first chunk.
要不然我出1krmb好了
比如 20100423164205.dat 和 20100423164205.x,确认文件 20100423164205.x 零长度即可。接收端只有存在 20100423164205.x 的情况下,才认为数据文件 20100423164205.dat 是完整的。