VFP保存大文件到MSSQL,最大2G,超过得上手段

2023-09-20 11:14:54

affb98a46370cb5595be10534fd3b113.gif

目前社群在聊这个大文件读取的问题,赵总说要把image字段换成BASE64来读取,我就一脸蒙。

02e646e5b0ac53c24032abbf80fcbc75.png

为什么要转BASE64,体积暴涨三分之一,明显直取更快,200MB文件对单个文件来说,不算大。

3634ded777386aaff0d65942779d47a0.png

赵总还写了啥直读程序,

e893c6635276b367ea0810b9a55d4e07.png

于是就来验证一下情况

拿出猫框,简单的操作一下

建立MSSQL数据库表

948a70b697b12cbe1bfe7f5d8663e658.png

1生成猫框DAL类

Define Class Dal_myfile As Qiyu_CursorAdapter Of Locfile('Qiyu_CursorAdapter.fxp')
    *--创建:祺佑工作室 日期:2023.09.20 http://www.sn58.cn
  Alias = 'myfile'
  WhereType =  1 && 1 关键字段 2 关键字段And可更新字段  3关键字段及其它已修改的字段 4 关键字段And时间戳
  KeyFieldList = "ID"  
  Tables = "myfile"
  oDAL=.F.
  nRecno=0  
  uId=.f.
  uOldId=.f.
  DataSourceType="ODBC"
  BufferModeOverride= 5  && 3 开放式行缓冲 5开放式表缓冲
  isUpdateDelcmd=.t. &&执行DELETE方法后,是否立即更新后台数据库
  FetchSize=-1
  
  
  InsertCmdRefreshFieldList='ID'
  UpdateCmdRefreshFieldList='ID'
  InsertCmdRefreshCmd='SELECT ID FROM myfile WHERE ID=@@IDENTITY'  
    PROCEDURE setupCA
      Text to This.SelectCmd noshow
    select TOP 1 ID,MYIMG from myfile ORDER BY id desc
    EndText
    Text to This.CursorSchema noshow
     ID   I(4) , MYimg  w(4) 
    EndText
    Text to This.UpdatableFieldList noshow
    ID,MYIMG 
    EndText
    Text to This.UpdateNameList noshow
    ID myfile.ID,MYIMG myfile.MYIMG
    EndText


    ENDPROC
    
  Procedure Init
  LPARAMETERS nCon,uId
  DoDefault(nCon)
    
    this.setupCA()  &&初始各个字段
  Endproc 


  Procedure New
    This.nRecno=recno(this.alias)
    this.add()
  Endproc


  Procedure Edit
    Lparameters cName
    this.nRecno=recno(this.alias)
  ENDPROC


  *--由子类实现
  Procedure Go
  Note:接收一个uId的参数,并刷新表内容 注意未决更新会导致刷新失败
  Lparameters uId
  
  Endproc
  
     
   *--勾子方法,删除之前执行
   Procedure OnBeforeDelete()
   Endproc


   *--勾子方法,删除之后执行
   Procedure OnAfterDelete()
   Endproc
    
    *--勾子方法,保存之后执行
  Procedure OnAfterSave
  Endproc


    *--勾子方法,保存之前执行
  Procedure OnBeforeSave
  Endproc


   Procedure OnAfterUndo()
   NOTE *--勾子方法,撤消之后执行
    select (this.alias)
    locate for this.nRecno=recno()
   Endproc


  Procedure FieldValid
    NOTE:勾子方法,定位到修改记录行,自行判断
  Endproc


PROCEDURE parsejson
      LPARAMETERS cJson,cRoot,naction,cKeylist
      LOCAL oReader,cField,nFieldState 
      oReader=Newobject("QiyuJsonReader","QiyuJsonReader.prg") &&JSON序列类
    oReader.cursorstruct=this.CursorSchema
    oReader.Alias=this.alias  &&临时表名
    oReader.root=cRoot  &&JSON数组所在位置 目前只支持第一层    
    oReader.keylist=this.KeyFieldList &&主键字段所在位置  
    oReader.parsecursor(cJson,naction) &&生成一个spaces表  
 
       IF !this.CursorAttach(this.alias,.t.)
          AERROR(laerror)
          this.msg=laerror(2)
          RETURN .f.
       ELSE
          RETURN .t.   
       endif 
    Endproc 
Enddefine

2 上传代码

xx=Getfile()
If !File(xx)
  Return
Endif
nsec=Datetime()
yy=Filetostr(xx)


oDal_myfile =Newobject("Dal_myfile","Dal_myfile.prg")
oDal_myfile.Nodata=.T.
oDal_myfile.CursorFill(.T.)
oDal_myfile.new()


Replace myimg With yy


If !oDal_myfile.Save()
  ?oDal_myfile.msg
Endif


?"上传时间",Datetime()-nsec

3 从后端数据库的保存到本地的代码

oDal_myfile =NEWOBJECT("Dal_myfile","Dal_myfile.prg")
oDal_myfile.cursorfill(.t.)
copy memo myimg to 1.rar

ae5c41d7034a6fca677d3ab34c123394.png

e748ff5cb1fa1ce803ee383410da2de3.png

472mb文件上传成功,下载成功,可以成功解压RAR文件。验证完毕。

SO EASY的猫框。

VFP文档中写W字段最大2G。

那突破也是有其它的方法,比如流式读写,上64位VFP。

无人区需要大家一起努力。

猫猫的心里话

加菲猫的VFP|狐友会社群接收投稿啦

加菲猫的VFP,用VFP不局限VFP,用VFP混合一切。无论是VFP,还是JS,还是C,只要能混合起来,都可以发表。

商业模式,销售技巧、需求规划、产品设计的知识通通可以发表。

暂定千字50元红包,,优秀的文章红包更大,一经发表,红包到手。

如何帮助使用VFP的人?

用VFP的人,有专业的,有非专业了,很多人其实是小白,问出的问题是小白,如果问题不对,我们引导他们问正确的问题。无论如何请不要嘲笑他们说帮助都不看,这么简单的问题都不会,嘲笑别人不行,而无法提出建设性答案,是很low的。

我们无论工作需要,还是有自己的软件,都是是需要真正的知识,如何让更多人学习真正的VFP知识呢,只需要点赞,在看,能转发朋友圈就更好了。

加菲猫的vfp倡导用"VFP极简混合开发,少写代码、快速出活,用VFP,但不局限于VFP,各种语言混合开发"

我已经带领一百多名会员成功掌到VFP的黑科技,进入了移动互联网时代,接下来我们要进入物联网领域。

2023年狐友会社群会员继续招募中

社群会员获取的权益有:

祺佑三层开发框架商业版(猫框),终身免费升级,终身技术支持。

开放的录播课程有:

微信小程序,微信公众号开发,H5 APP开发,Extjs BS开发,VFP面向对象进阶,VFP中间层开发。

源码类资源有:

支付组件源码,短信源码,权限组件源码,一些完整系统的源码。这个可以单独出售的,需要的可以联系我。

会员也可以实现群内资源对接,可以接分包,合作等各项商业或技术业务

40719e31130b13b46dbb2d857834514a.gif

986be9bc7219beda2f32a03e3d858f88.jpeg

e9c9ae5d20586fd957de8b8cd512a45f.gif

更多推荐

5W2H分析法

1.概念它的历史可以追溯到二战时期的美国陆军兵器修理部,虽然具体由谁发明可能存在争议,但可以肯定的是,这种方法在当时被广泛应用,并被证明是一种非常有效的创新和问题解决方法。5W2H分析法以五个以W开头的英语单词和两个以H开头的英语单词为线索,帮助人们发现问题,寻找解决方案,进行设计构思,从而创新和发明新的项目。它与其他

QT Day5

目录1.针对登入框,新加入了注册功能,使用数据库存储账号密码信息widget.hwidget.cppsecond.hsecond.cpp2.思维导图1.针对登入框,新加入了注册功能,使用数据库存储账号密码信息widget.h#ifndefWIDGET_H#defineWIDGET_H#include<QWidget>#

7.1 实现进程内存块枚举

在Windows操作系统中,每个进程的虚拟地址空间都被划分为若干内存块,每个内存块都具有一些属性,如内存大小、保护模式、类型等。这些属性可以通过VirtualQueryEx函数查询得到。该函数可用于查询进程虚拟地址空间中的内存信息的函数。它的作用类似于Windows操作系统中的TaskManager中的进程选项卡,可以

安达发|APS软件多工厂架构引领生产管理新革命

APS多工厂架构是一种生产管理系统,它通过将多个工厂的生产过程进行整合和优化,实现了生产效率的提高和成本的降低。在APS多工厂架构中,每个工厂都有自己的生产线和生产计划,但是它们之间可以进行协调和协作,以确保整个生产过程的顺利进行。APS多工厂架构的核心是生产计划和调度。在生产过程中,需要对各个工厂的生产计划进行协调和

java正则表达式

用于模式匹配,例如查询串中的数字、验证邮箱是否符合要求等。在java中主要实现类有Pattern类、Matcher类。Pattern类没有公共构造方法由静态方法Pattern.compile()构建,主要用于构造正则表达式并创建Matcher类。Matcher类是对输入字符串进行解释和匹配的引擎。实例演示//创建Pat

7.2 通过API创建新进程

创建新的进程是Windows程序开发的重要部分,它可以用于实现许多功能,例如进程间通信、并行处理等。其中,常用的三种创建进程的方式分别是WinExec()、ShellExecute()和CreateProcessA(),这三种创建进程的方式各有特点。如果需要创建简单进程或从其他程序启动新进程,可以使用WinExec()

qq邮箱smtp要怎样设置开启状态?

qq邮箱smtp是一个重要的发信服务,不仅适用于企业也适用于个人用户。为了提高邮件的触达率和有效性,开启qq邮箱smtp服务是必须的。那么,怎样开启qq邮箱smtp服务?怎么设置?下面蜂邮就给大家介绍一下。一、开启qq邮箱smtp服务qq邮箱smtp是qq的高级邮箱服务之一,需要先开启高级功能才可以使用。开启操作如下:

如何实现一个简单的深度优先搜索(DFS)算法?

聚沙成塔·每天进步一点点⭐专栏简介⭐实现深度优先搜索⭐写在最后⭐专栏简介前端入门之旅:探索Web开发的奇妙世界记得点击上方或者右侧链接订阅本专栏哦几何带你启航前端之旅欢迎来到前端入门之旅!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发者,这里都将为你提供一

Java中的隐式转换和强制转换底层是怎么做的?

目录1.回顾数值型基本数据类型共有哪些?2.什么时候进行隐式类型转换?3.数据类型的隐式转换规则4.特殊隐式转换规则需牢记5.隐式转换小练习5.1byte与byte如何转?5.2int,long,double的转换5.3byte,short,long的转换6.强制转换如何转换?7.强制转换有哪些问题?1.回顾数值型基本

Windows如何删除“$WINDOWS.~BT“文件夹,解决权限不足无法删除

$WINDOWS.~BT是干嘛的$Windows.BT是升级或者安装Windows操作系统中间过程中产生的临时文件夹,一般用于保存下载后的升级文件,或者安装过程中复制文件时产生的。用于保存Windows安装记录,包括配置资料,错误报告等,如果安装失败便可反馈给微软公司,帮助用户解决安装过程中出现的问题。如果系统可正常运

GaussDB数据库SQL系列-表连接(JOIN)

目录一、前言二、GaussDBJOIN1、LEFTJOIN2、LEFTJOINEXCLUDINGINNERJOIN3、RIGHTJOIN4、LEFTJOINEXCLUDINGINNERJOIN5、INNERJOIN6、FULLOUTERJOIN7、FULLOUTERJOINEXCLUDINGINNERJOIN三、Gau

热文推荐