当前位置: 网学 > 编程文档 > SQL SERVER > 正文

在VFP中处理SQLSERVER的IMAGE字段的两种方法

来源:Http://myeducs.cn 联系QQ:点击这里给我发消息 作者: 用户投稿 来源: 网络 发布时间: 12/10/18
下载{$ArticleTitle}原创论文样式

方法一:原理——SQLSERVER的IMAGE字段存储格式是十六进制字符串,将十六进制字符串通过转换成字符串后利用字符串与文件的互换函数FileToStr与StrToFile可得到需要的结果。
写入SQLSERVER中:利用FileToStr()函数将二进制文件转为字符串后,再转换为16进制字符串,然后写入SQLSERVER的IMAGE类型字段
从SQLSERVER中读:先从SQLSERVER中按SQLSERVER规定(单次最多8000字符)将16进制文件分节取得并合并,再利用StrToFile转换成二进制文件

以下为方式一的实际示例:
****************************************************************************************
SET SAFETY OFF &&指定在改写已有文件时不显示对话框
LOCAL cImgFile
PUBLIC nCon
nCon=SQLSTRINGCONNECT("driver=SQL Server;Server=SERVER;Uid=sa;pwd=;database=DBSMarket")
cImgFile="E:\My Documents\aaaa.JPG"
*=MESSAGEBOX(cImgFile,0,"")
cImgFile=DownLoadFile(cImgFile)
@1,1 SAY cImgFile BITMAP && 显示图形文件
*cImgFile=GETPICT("JPG;BMP")
*=MESSAGEBOX(cImgFile,0,"")
*DO UpLoadFile WITH cImgFile
=SQLDISCONNECT(nCon)

*!* 使用的过程与函数
*!* 因为向SqlServer写入IMAGE类型字段要把原始数据转换成16进制代码,所以要建一个16进制转换过程,IMAGE字段并不只限于图像文件,任何二进制文件(包括EXE可执行文件)都可转换成十六进制后写入。

*!* 字符转换函数(ASC码字符串转为十六进制代码)
*!* 输入参数是字符串,可以把要传的文件用filetostr()函数转为字符串后用此过程转为16进制字符串。
PROCEDURE ASCToHex()
LPARAMETERS cStrTo
LOCAL cChrSet,nToHex,nHex,I,nLen,ArrHex(256)
cChrSet="0123456789ABCDEF"
FOR I=0 TO 255
nToHex=FLOOR(I/16)+1
nHex=IIF(I%16=0,1,nHex+1)
ArrHex(I+1)=SUBSTR(cChrSet,nToHex,1)+SUBSTR(cChrSet,nHex,1)
ENDFOR
cChrSet=""
nLen=LEN(cStrTo)
FOR I=1 TO nLen
cChrSet=cChrSet+ArrHex(ASC(SUBSTR(cStrTo,I,1))+1)
ENDFOR
RETURN cChrSet
ENDPROC

*!* 写入(上传至数据库)过程。传入参数是文件名,例中的ImgBody字段是image类型
PROCEDURE UpLoadFile
LPARAMETERS cFileName
LOCAL cStr,cHex
cStr=FILETOSTR(cFileName)
cHex="0x"+ASCToHex(cStr) && "0x"一定得加,这样SQL SERVER才会把它当作16进制代码处理
*cSqlStr="insert into TabName(ImgBody) select "+cHex
cSqlStr="update YourTable set photo="+cHex+" Where Idno=''000001''"
=SQLEXEC(nCon,cSqlStr)
ENDPROC

*!* 读取(自服务器下载)过程。输入参数是要转换成的文件名称
PROCEDURE DownLoadFile
LPARAMETERS cFileName
LOCAL I,cSqlStr,cStrChr,cStrHex
cStrChr=""
cStrHex=""
FOR m.I=1 TO 10000000 && 下载时只能每次8000字节,这是SQL2000中限定的
* cSqlStr="select substring(ImgBody,"+ALLTRIM(STR(m.I-1))+"*8000+1,8000) as ImgField from TabName where no1=1"
cSqlStr="select substring(photo,"+ALLTRIM(STR(m.I-1))+"*8000+1,8000) as ImgField from YourTable Where Idno=''000001''"
=SQLEXEC(nCon,cSqlStr,"CurTemp")
SELECT CurTemp
cStrHex=CurTemp.ImgField
USE IN ("CurTemp")
IF LEN(cStrHex)=0 && 文件下载完后自动跳出循环。
EXIT
ENDIF
cStrChr=cStrChr+cStrHex && 拼合下载的内容
ENDFOR
STRTOFILE(cStrChr,cFileName)
RETURN cFileName
ENDPROC
***************************************************************

  • 上一篇资讯: Access 文件规定
  • 网学推荐

    免费论文

    原创论文

    浏览:
    设为首页 | 加入收藏 | 论文首页 | 论文专题 | 设计下载 | 网学软件 | 论文模板 | 论文资源 | 程序设计 | 关于网学 | 站内搜索 | 网学留言 | 友情链接 | 资料中心
    版权所有 QQ:3710167 邮箱:3710167@qq.com 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
    Copyright 2008-2015 myeducs.Cn www.myeducs.Cn All Rights Reserved
    湘ICP备09003080号