注册 登录
编程论坛 VFP论坛

关于SQL数据库图片更改后不能存盘的问题

fanjinyu9108 发布于 2022-02-17 11:06, 1600 次点击
在SQL数据库建立表shebei,字段PIC 数据类型是TEXT.程序如下:
程序代码:
LOCAL xfilename,xfiletext
xfilename = GETFILE('DOCX,XLSX,jpg')
xfiletext = strconv(FILETOSTR(xfilename),13)
SELECT shebei_one   &&本地临时表shebei_one是从shebei表的一个查询结果,编辑完后保存到远程表shebei
replace pic WITH xfiletext  && pic字段是SQL的TEXT类型

SELECT shebei_one
lcTextString=xfiletext
Thisform.pf.page1.Image1.Stretch = 2
Thisform.pf.page1.Image1.PictureVal=Strconv(lcTextString,14)

&&后面的程序是保存到远程表SHEBEI,因为使用的通用程序,省略。


问题是这样的,当shebei_one添加记录,执行以上程序后,再使用spt的方式INSERT,保存成功,但是如果编辑shebei_one表,再使用spt的方式UPDATE,保存失败,这是
怎么回事呢?
10 回复
#2
mywisdom882022-02-17 11:35
你不编辑,直接用INSERT的这个,改为更新看看
也就是
insert ...
这个位置的语句,直接换成
update ...
看看是否成功,查看
如果成功,那再看,从SQL读下来后,不做任何修改编辑,直接 点 update 看看
#3
fanjinyu91082022-02-18 06:59
问题可能在别的哪个环节,我直接用以下程序,保存成功
程序代码:
LOCAL xfilename,xfiletext
xfilename = GETFILE('DOCX,XLSX,jpg')
xfiletext = strconv(FILETOSTR(xfilename),13)




 字符串=["select * from shebei where id=2","shebei_one1"]

 连接临时_yk()   &&调用远程连接

 Ac=SQLEXEC(nhandle,&字符串)

 IF  Ac<0
       =SQLDISCONNECT(nhandle)
       MESSAGEBOX("读取错误!",0,"错误信息")
     
       RETURN TO MASTER

 ELSE
    SELECT shebei_one1
   
     Ac2=SQLEXEC(nhandle,"update shebei set pic=?xfiletext ")
     IF ac2>0
        =MESSAGEBOX("保存成功")
     else
        =MESSAGEBOX("保存失败")
     endif     
      =SQLDISCONNECT(nhandle)

 endif  
#4
fanjinyu91082022-02-18 07:45
但是我采用另外的方式就不能成功
程序代码:
字符串=["select * from shebei where id=2","shebei_one"]
连接临时_yk()   &&调用远程连接

 Ac=SQLEXEC(nhandle,&字符串)

 IF  Ac<0
       =SQLDISCONNECT(nhandle)
       MESSAGEBOX("读取错误!",0,"错误信息")
     
       RETURN TO MASTER

 ELSE
   

 endif  

ac1=SQLEXEC(nhandle,"select * from shebei ","c_t")  && 产生表
IF  ac1<0
      = SQLDISCONNECT(nhandle)
      MESSAGEBOX("读取数据错误!",0,"错误信息")
      RETURN TO MASTER
ELSE
    SELECT c_t
    CURSORSETPROP("tables","shebei","c_t")
    CURSORSETPROP("keyfieldlist","id","c_t")
    CURSORSETPROP("updatablefieldlist","id,pic","c_t")
    yy='id shebei.id,pic shebei.pic'
    CURSORSETPROP("updatenamelist",yy,"c_t")
    CURSORSETPROP("sendupdate",.t.,"c_t")
    CURSORSETPROP("wheretype",2)
    cursorsetprop("buffering",5)  &&设置表缓冲
    UPDATE c_t SET pic=shebei_one.pic from shebei_one WHERE c_t.id= shebei_one.id
    SQLSetprop(nhandle,'Transactions',2)        && 开启远程手工事务
    BEGIN TRANSACTION
        select c_t
        a1=TABLEUPDATE(.t.)
        IF a1=.t.
         END TRANSACTION  
        ELSE
            rollback  
        ENDIF
   
    SQLSetprop(nhandle,'Transactions',1)        && 开启远程自动事务
    = SQLDISCONNECT(nhandle) &&关闭
    IF a1=.t.
       MESSAGEBOX("数据保存成功!",0,"信息")
    ELSE
       MESSAGEBOX("数据保存失败!",0,"信息")
    endif
   
  
ENDIF  &&数据查询

 


运行完成显示:数据保存失败! 这是怎么回事呢?
#5
mywisdom882022-02-18 08:41
回复 4楼 fanjinyu9108
你用这个方法,保存其他字段,看看是否成功。不要保持你 图片这个字段,随便保存其他1个字段,
如果能保存,问题就是“VFP与SQL中,保存图片的字段”中存在冲突,但如果同样,是错误的,那就是你这个段语句问题。
同时,
yy='id shebei.id,pic shebei.pic'
CURSORSETPROP("updatenamelist",yy,"c_t")
直接改为

* yy='id shebei.id,pic shebei.pic'
CURSORSETPROP("updatenamelist","id shebei.id,pic shebei.pic","c_t")  &&看看,是不是这里导致的

[此贴子已经被作者于2022-2-18 09:30编辑过]

#6
fanjinyu91082022-02-18 18:44
不是的,假如把PIC换成别的字段,就不会出现保存失败,
或者不使用这一句: UPDATE c_t SET pic=shebei_one.pic from shebei_one WHERE c_t.id= shebei_one.id ,也能保存成功
您说问题就是“VFP与SQL中,保存图片的字段”中存在冲突,那怎么解决呢


[此贴子已经被作者于2022-2-18 18:58编辑过]

#7
fanjinyu91082022-02-18 19:00
为什么用=SQLEXEC(nhandle,"update shebei set pic=?mypic ")就不会出现问题呢?
#8
fanjinyu91082022-02-19 11:48
还有,当PIC的值是NULL时,保存也会成功
#9
fanjinyu91082022-02-19 11:56
保存失败的原因终于找到了:把CURSORSETPROP("wheretype",2,"c_t")改成CURSORSETPROP("wheretype",1,"c_t"),立刻就解决了
#10
mywisdom882022-02-21 08:44
以下是引用fanjinyu9108在2022-2-19 11:56:05的发言:

保存失败的原因终于找到了:把CURSORSETPROP("wheretype",2,"c_t")改成CURSORSETPROP("wheretype",1,"c_t"),立刻就解决了


1或DB_键(来自FOXPRO.H)。用于更新远程表的WHERE子句仅由KeyFieldList属性指定的主字段组成。
2或DB_键可更新(来自FOXPRO.H)。用于更新远程表的WHERE子句由KeyFieldList属性指定的主字段和任何可更新字段组成。
3或DB_键并修改(来自FOXPRO.H)(默认)。用于更新远程表的WHERE子句由KeyFieldList属性指定的主字段和任何其他修改的字段组成。
4或DB_键和时间戳(来自FOXPRO.H)。用于更新远程表的WHERE子句由KeyFieldList属性指定的主字段和时间戳的比较组成。

应该都可以的,是不是你表有问题,你看看,你最后结果是否真的保持了,
#11
fanjinyu91082022-02-21 12:15
表可能有问题,原来pic用TEXT数据类型,添加图片后,居然在SQL服务器内不能删除记录,后改成VCHAR(MAX),才没有问题了
1