透明 发表于 2015-1-16 22:34:09

MSSQL编程:使用Winsock下载文件(撑持断点续传)

Mysql的存储引擎接口定义良好。有兴趣的开发者可以通过阅读文档编写自己的存储引擎。下载第一步,创建工程,援用Winsock(VisualBasic最好打SP6,不然MS有一个Bug),在此省略

第二步,详细完成代码步骤1:发送哀求
申明:
(1)这里复杂接纳了判别是不是已有同名文件暗示是不是要断点续传
(2)下载的地点,巨细和已下载字节数也只是复杂地存在ini文件中,更平安的做法本文不作会商
有乐趣的伴侣能够接洽我

--------------------------------------------------------------------------------
Name:DownloadFile
Author:Reker2004/3/20
Desc:毗连远端主机,发送吸收文件哀求,守候远端主机呼应
Params:None
History:None
--------------------------------------------------------------------------------
PrivateSubDownloadFile()
OnErrorResumeNext
StartTime=Time()
WithWinSck
.RemoteHost=Host远端主机地点
.RemotePort=80
.Connect
守候服务器毗连响应
DoWhile.StatesckConnected
DoEvents:DoEvents:DoEvents:DoEvents
20秒超时
IfDateDiff("s",StartTime,Time())>20Then
ShowInfo"毗连超时"
.Close
ExitSub
EndIf
Loop
发送下载文件哀求
此处利用HTTP/1.0协定
strCommand="GET"+UpdateURL+"HTTP/1.0"+vbCrLf下载地点
strCommand=strCommand+"Accept:*/*"+vbCrLf这句能够不要
strCommand=strCommand+"Accept:text/html"+vbCrLf这句能够不要
strCommand=strCommand+vbCrLf
strCommand=strCommand&"Host:"&Host&vbCrLf
IfDir(SaveFileName)""Then是不是已存鄙人载文件
Dimconfirm
confirm=MsgBox("已存在文件,是不是断点续传?",vbYesNo+vbQuestion,"提醒")
Ifconfirm=vbYesThen
DownPosition=""
IfNotoFileCtrl.ReadKeyFromIni("Update","DownSize",AppPath+"Update.ini",DownPosition)Then
读取前次下载的字节数
MsgBox"读取巨细毛病",vbInformation,"提醒"
EndIf
发送断点续传哀求
strCommand=strCommand&"Range:bytes="&CLng(DownPosition)&"-"&vbCrLf
Else
KillSaveFileName删除原文件
EndIf
EndIf
strCommand=strCommand&"Connection:Keep-Alive"&vbCrLf
strCommand=strCommand&vbCrLf
.SendDatastrCommand
EndWith
IfErrThen
lblProcessResult.Caption=lblProcessResult.Caption&vbCrLf&vbCrLf&"下载文件堕落:"&Err.Description
lblProcessResult.Refresh
EndIf
EndSub


第二步,详细完成代码步骤2:吸收数据
--------------------------------------------------------------------------------
Name:Winsck_DataArrival
Author:Reker2004/3/20
Desc:略
Params:略
Return:None
History:None
--------------------------------------------------------------------------------
PrivateSubWinsck_DataArrival(ByValbytesTotalAsLong)
OnErrorResumeNext
DoEvents:DoEvents
DimByteData()AsByte
WinSck.GetDataByteData(),vbByte
ReceiveData=ReceiveData&StrConv(ByteData(),vbUnicode)
IfInStr(1,ReceiveData,"Content-Length:")>0AndFileSize=0Then仅第一次盘算,FileSize=0
Dimpos1AsLong,pos2AsLong
pos1=InStr(1,ReceiveData,"Content-Length:")
pos2=InStr(pos1+16,ReceiveData,vbCrLf)
Ifpos2>pos1Then
FileSizeByte=Mid(ReceiveData,pos1+16,pos2-pos1-16)盘算文件的长度
StartTime=Timer()保留入手下手下载的工夫
ProgssBar.Max=FileSizeByte设置进度条
FileSize=FormatNumber(FileSizeByte/1024,2)以KB暗示
ShowInfo"本次下载的文件共"+CStr(FileSize)+"KB..."
EndIf
EndIf
从服务器呼应前往的数据查找下载文件的肇端地位
IfFileHeaderLen=0Then
Fori=0ToUBound(ByteData())-3
IfByteData(i)=13AndByteData(i+1)=10AndByteData(i+2)=13AndByteData(i+3)=10Then
StartPos=i+4将文件头的长度保留上去
FileHeaderLen=StartPos
ExitFor
EndIf
DoEvents
Nexti
EndIf
FileSizeHaveDown=bytesTotal+FileSizeHaveDown-FileHeaderLen
已下载文件长度,需减往呼应的文件头长度
dblDownloadSpeed=FormatNumber(FormatNumber(FileSizeHaveDown/1024,2)/(FormatNumber((Timer()-StartTime),4)),2)盘算下载速度KB/S
IfdblDownloadSpeed0Then盘算残剩下载的工夫
sRestTime=GetRestTime(CLng((FileSize-(FileSizeHaveDown)/1024)/dblDownloadSpeed))此历程略,能够删除此段代码
labRestTime.Caption="残剩工夫:º"+sRestTime
labRestTime.Refresh
EndIf
labDownloadSpeed.Caption=CStr(dblDownloadSpeed)+"kb/s"
labDownloadSpeed.Refresh
ProgssBar.Value=FileSizeHaveDown
写数据
Fnum=FreeFile()
OpenSaveFileNameForBinaryLockWriteAs#Fnum
IfLOF(Fnum)>0Then
Seek#Fnum,LOF(Fnum)+1
EndIf
IfStartPos>0Then
Fori=StartPosToUBound(ByteData())
Put#Fnum,,ByteData(i)
Nexti
Else
Put#Fnum,,ByteData()
EndIf
Close#Fnum
IfErrThen
lblProcessResult.Caption=lblProcessResult.Caption&vbCrLf&猎取数据堕落:"&Err.Description
lblProcessResult.Refresh
EndIf
EndSub但我们知道,若使用statement,并没有上述需要的数据。试想binlog中记录了一句updatetsetf1=3whereid=3。怎么恢复呢?

谁可相欹 发表于 2015-1-19 16:34:13

以前的DTS轻盈简单。但是现在的SSIS虽然功能强大了很多,但是总是让人感觉太麻烦。看看论坛中询问SSIS的贴子就知道。做的功能太强大了,往往会有很多用户不会用了

admin 发表于 2015-1-27 21:08:41

发几份SQL课件,以飨阅者

金色的骷髅 发表于 2015-2-5 12:05:52

记得在最开始使用2k的时候就要用到这个功能,可惜2k没有,现在有了作解决方案的朋友会很高兴吧。

老尸 发表于 2015-2-11 17:35:11

呵呵,这就是偶想说的

若相依 发表于 2015-3-2 17:00:04

我个人认为就是孜孜不懈的学习

柔情似水 发表于 2015-3-11 04:42:29

发几份SQL课件,以飨阅者

再现理想 发表于 2015-3-17 20:52:03

一个是把SQL语句写到客户端,可以使用DataSet进行加工;
页: [1]
查看完整版本: MSSQL编程:使用Winsock下载文件(撑持断点续传)