| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2251 人关注过本帖, 2 人收藏
标题:能上传最大180M多的文件到SQL2000[分享]
只看楼主 加入收藏
mywisdom88
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:191
帖 子:3147
专家分:8408
注 册:2015-3-25
结帖率:98.98%
收藏(2)
已结贴  问题点数:20 回复次数:4 
能上传最大180M多的文件到SQL2000[分享]
*来自梅子论坛
*clear
= sqlsetprop(0,[DISPWARNINGS],(.f.))   &&不提示错误信息
= sqlsetprop(0,[DISPLOGIN],3)          &&不显示ODBC登录框
= sqlsetprop(0,[CONNECTTIMEOUT],10)    &&连接等待时间
= sqlsetprop(0,[QUERYTIMEOUT],600)     &&错误等待时间
= sqlsetprop(0,[WaitTime],600)        &&执行前延迟时间
* QUERYTIMEOUT 参数,开始是10,最大才40M,最后设置到600,最大能280M,但查看SQL2000数据发现,当超过185M以后,数据就无效,测试条件 SQL2000+VFP9.0+WIN7 32
*现在下载时,发现1个问题,当此程序第1次下载时,在红色处会报错误,说要备注字段才可以。但点取消后,第2次下载时,就不会报错误,能正常下载数据。
con=sqlstringconnect("driver=sql server;server=atm8505;uid=sa;pwd=zjh123456;database=master")
if con>0
   xfiles=GETFILE()
   IF !EMPTY(xfiles) &&
      M1=LEN(CREATEBINARY(Filetostr('&xfiles')))
      SET COMPATIBLE ON
      ?M1
      xx=SQLEXEC(con,"insert into test(id,img) values(?INT(M1/1000000),?CREATEBINARY(Filetostr('&xfiles')) )")
      SET COMPATIBLE OFF  
      ?con,xx
   ELSE
   
   *下载
      xfiles=[g:\a1.rar]
      xx=SQLEXEC(con,"SELECT ID,img FROM test WHERE id=184","temp")
      CURSORSETPROP("MapBinary",.T.,0)
      COPY MEMO TEMP.img TO &xfiles
      ?con,xx
      USE IN TEMP
   ENDIF

   SQLDISCONNECT(con)
ENDIF
搜索更多相关主题的帖子: 信息 
2016-06-08 18:03
tlliqi
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:204
帖 子:15453
专家分:65956
注 册:2006-4-27
收藏
得分:20 
谢谢分享
2016-06-08 18:54
mywisdom88
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:191
帖 子:3147
专家分:8408
注 册:2015-3-25
收藏
得分:0 
图片附件: 游客没有浏览图片的权限,请 登录注册

只要第1次下载,都会报这个,但确定后,再运行,只要不退出VFP,就正常了。
2016-06-09 13:38
mywisdom88
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:191
帖 子:3147
专家分:8408
注 册:2015-3-25
收藏
得分:0 
回复 3楼 mywisdom88
找到答案了;
xx=SQLEXEC(con,"SELECT ID,img FROM test WHERE id=184","temp")
CURSORSETPROP("MapBinary",.T.,0)
COPY MEMO TEMP.img TO &xfiles
把上面的第2行放到上面去就OK了
CURSORSETPROP("MapBinary",.T.,0)
xx=SQLEXEC(con,"SELECT ID,img FROM test WHERE id=184","temp")
COPY MEMO TEMP.img TO &xfiles
2016-06-09 16:10
mywisdom88
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:191
帖 子:3147
专家分:8408
注 册:2015-3-25
收藏
得分:0 
回复 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
2016-06-09 19:13
快速回复:能上传最大180M多的文件到SQL2000[分享]
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.043444 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved