回复 4楼 mywisdom88
*经过修改后,基本OK,但在下载的时候,进度不动,同样的代码在上传的时候是会动的。
=sqlsetprop(0,[DISPWARNINGS],(.f.))
&&不提示错误信息
=sqlsetprop(0,[DISPLOGIN],3)
&&不显示ODBC登录框
=sqlsetprop(0,[CONNECTTIMEOUT],10)
&&连接等待时间
=sqlsetprop(0,[QUERYTIMEOUT],600)
&&错误等待时间,刚开始是10的,只能40M,看帮助,设600,能成功上传280M
=sqlsetprop(0,[WaitTime],600)
&&执行前延迟时间,刚开始,是没设置这项,能成功上传115M。
cServer="173.13.99.63,1433"
cDbs="master"
cUid="sa"
cPwd="123456"
*SQL2000测试表名为 test(id int identity(1,1),fn varchar(40),fs numeric(10,0),fr varchar(40),img image,dt datetime)
csql=[driver=sql server;server=]+cServer+[;uid=]+cUid+[;pwd=]+cPwd+[;database=]+cdbs
con=sqlstringconnect(csql)
if con>0
LOCAL xfiles,xfn,xfs,xfr,xln,xfm,res,i,k,lcWait
xfiles=GETFILE()
IF !EMPTY(xfiles)&&为了测试方便,当选择文件时就上传,不选择时,就下载
SET COMPATIBLE ON
xfn = LOWER(SUBSTR(xfiles,IIF(rat("\",xfiles)>0,rat("\",xfiles)+1,1)))
xfs = eval(trans(fsize(xfiles),'@0'))
xdt = DATETIME()
IF Agetfileversion(a_ver,xfiles)>0
xfr = a_ver[4]
ELSE
xfr = ""
Endif
*!* fm = CREATEBINARY(Filetostr('&xfiles')) &&不能这样,变量大小限制
SQLSetprop(con, "Asynchronous", .T.) && 异步方式
res=SQLEXEC(con,"insert into test(fn,fs,fr,img,dt) values(?xfn,?xfs,?xfr,?CREATEBINARY(Filetostr('&xfiles')),?xdt)")
IF res>=0
i=1
k=1
DO WHILE SQLEXEC(m.con)=0
DOEVENTS
i=i+1
IF i<1500
ELSE
i=1
k=IIF(k=20,1,k+1)
ENDIF
lcWait="正在上传数据" + REPLICATE("■",k) + REPLICATE("□",20-k)
WAIT WINDOW NOWAIT (lcWait)
ENDDO
SQLSetprop(con, "Asynchronous", .f.) && 同步方式,检查刚才的文件是否存在
res=SQLEXEC(con,"select fn,fs,fr,dt from test where fn=?xfn and fs=?xfs and fr=?xfr and dt=?xdt","up_tmp",aCnt)
IF res>0 AND aCnt(2)>0
MESSAGEBOX("上传文件【" + xfn +"】成功!",64,"上传文件")
ELSE
MESSAGEBOX("上传文件【" + xfn +"】失败!",48,"上传文件")
ENDIF
ELSE
MESSAGEBOX("上传文件【" + xfn +"】连接失败!",48,"上传文件")
ENDIF
SET COMPATIBLE OFF
ELSE
*下载
SQLSetprop(con, "Asynchronous", .T.) && 异步方式
CURSORSETPROP("MapBinary",.T.,0)
&&这个要在查询之前
res=SQLEXEC(con,"SELECT top 1 id,fn,fs,fr,img,dt FROM test order by id desc","dw_tmp")
IF res>=0 &&异步方式时,正常返回值 0;
i=1
k=1
DO WHILE SQLEXEC(m.con)=0 &&异步方式,
奇怪,这里怎么只运行1次,也就是说不会动;上传数据是会动的,
DOEVENTS
i=i+1
IF i<1500
&& 什么都不做,减速显示
ELSE
i=1
k=IIF(k=20,1,k+1)
ENDIF
lcWait="正在下载数据" + REPLICATE("■",k) + REPLICATE("□",20-k)
WAIT WINDOW NOWAIT (lcWait)
ENDDO
IF TYPE("img")="W" AND RECCOUNT("dw_tmp")>0 &&数据下载完成 image 类型
xfiles=[e:\a1.rar] &&这个名称可以换成 xfiles=[e:\]+allt(fn)
COPY MEMO dw_tmp.img TO &xfiles
MESSAGEBOX("下载文件【" + xfiles +"】成功!",64,"下载文件")
ELSE
MESSAGEBOX("下载文件【" + xfiles +"】失败!",48,"下载文件")
ENDIF
IF USED("dw_tmp")
USE IN dw_tmp
ENDIF
ELSE
MESSAGEBOX("下载文件连接失败!",48,"下载文件")
ENDIF
ENDIF
SQLDISCONNECT(con)
ELSE
MESSAGEBOX("连接数据库失败!",48,"下载文件")
ENDIF