JPGImg: TJPEGImage; ADOData: TADOBlobStream; begin
JPGImg := TJPEGImage.Create; ADOData :=
TADOBlobStream.Create(TBlobField(DataModule1.PatientInfoTable.FieldByName('图像1')), bmWrite); try
JPGImg.Assign(img.Picture.Bitmap); JpgImg.SaveToStream(ADOData); finally JPgImg.Free; ADOData.Free; end; end;
读取代码如下:
procedure LoadPicture(img: TImage); var
PicData: TADOBlobStream;
SQL Server存储图像数据的策略与方法
目前对于图像数据的管理大都采用表+实体的方法,即图像数据以文件形式存放于指定的计算机目录下,在数据库表中只反映图像数据文件的存储路径。这种管理模式,给数据的维护增加了难度,同时,也给数据的安全带来一定的隐患。因此,要真正做到各类数据在数据库中安全管理,研究和探索直接将图像数据存储在数据库关系表中的方法是非常必要的。
笔者在Visual Basic 6.0开发环境中,采用客户机/服务器的工作方式,针对SQL Server数据库关系表中存储图像数据的问题进行了初步探讨,提出了一套基本解决方案,供读者参考。
一、 存储图像数据的策略
图像数据库技术一直致力于解决海量数字图像的有效存储和管理问题。它是数据库技术的继承和发展,一方面,图像数据和文本数据存在着本质的区别,在文本数据领域得以成功应用的传统数据库技术,如果一成不变的照搬到图像数据库领域,结果往往是低效,
甚至无效;另一方面,传统数据库的许多成果,如SQL语言、索引技术等都值得图像数据库借鉴。上述两个方面的结合成为目前图像数据库技术发展的主流。
1.1 BLOB数据类型
BLOB是非常巨大的不定的二进制或者字符型数据,通常是文档(.txt、.doc)和图片(.jpeg、.gif、.bmp),它可以存储在数据库中。在SQL Server中,BLOB可以是text、ntext或者image数据类型。 Image数据类型存储的是长度不确定的二进制数据,最大长度是2GB。
BLOB数据在SQL Server系统中的存储方式不同于普通的数据类型,对于普通类型的数据系统直接在用户定义的字段上存储数据值,而对于BLOB类型数据,系统开辟新的存储页面来存放这些数据,表中BLOB类型数据字段存放的仅是一个16个字节的指针,该指针指向存放该条记录的BLOB数据的页面。
1.2 BLOB的设计策略
BLOB数据是数据量很大的数据类型,它会占用大量的硬盘空间、内存和网络资源,因此合理地设计包含有BLOB数据类型的属性表,对提高存储效率、查询速度有很大的影响。一般BLOB的
设计原则如下:
(1) 使用BLOB数据类型还是使用varchar或者varbinary数据类型
二进制大对象并不一定要存储为text、ntext或者image数据类型,它们也可以作为varchar或者varbinary数据类型村处在表格中。数据类型的选择要根据将要存储的BLOB的实际大小。如果数据不会超过8K,那么就使用Varchar或者varbinary数据类型。如果这些大对象的尺寸超过8K,那么就使用text、ntext或者image数据类型。
(2) 存储BLOB在数据库中或者在文件系统中
常见的设计问题是将图片存在数据库中还是存在文件系统中。在大多数情况下,最好把图片文件与其它数据一起存在数据库中。因为将影像数据文件存储在数据库中有许多优点:
易于管理 当BLOB与其他数据一起存储在数据库中时,BLOB和表格是数据一起备份和恢复。这样就降低了表格数据与BLOB数据不同步的机会,而且降低了其他用户无意中删除了文件系统中BLOB数据位置的路径和风险。另外,将数据存储在数据库中BLOB和其他数据的插入、更新和删除都在同一个事务中实现。这样
就确保了数据的一致性和文件与数据库之间的一致性。还有一点好处是不需要为文件系统中的文件单独设置安全性。
可伸缩性 尽管文件系统被设计为能够处理大量不同大小的对象,但是文件系统不能对大量小文件进行优化。在这种情况下,数据库系统可以进行优化。
可用性 数据库具有比文件系统更多的可用性。数据库复制允许在分布式环境中复制、分配和潜在的修改数据。在主系统失效的情况下,日志转移提供了保留数据库备用副本的方法。
当然,在某些情况下,将图片存储在文件系统中将是更好的选择:
(1)使用图片的应用程序需要数据流性能,例如实时的视频重现。
(2)象Microsoft PhotoDraw或者Adobe Photoshop这样的应用程序经常访问BLOB,这些应用程序只知道怎样访问文件。
(3)需要使用一些NTFS文件系统中的特殊功能,例如远程存储。
二、 存储图像数据的方法
1 建立具有image宇段的SQL Server数据库
当需要在SQL Server数据库中存储图像数据时,首先应建立包含image数据类型字段的数据库关系表。SQL Server数据库平台支持的数据类型中,image数据类型主要用于存储图像数据等大段的二进制数据。SQL Server 7.0之后的版本,image类型可存储2GB的数据。
2 使用Remote Data控件建立与数据库的连接
Remote Data控件是在Visual Basic应用程序中用来获取远程数据的控件。它在.远程数据对象(RDO)和数据绑定控件之间提供了接口,只要给它提供有关数据存储的位置、获取的数据和一些接口控制,就可以连接到数据库,实现对数据库的基本操作。
使用Remote Data控件建立与远程数据库的连接步骤如下:
1.在Visual Basic的窗体中加入一个Remote Data控件。 ,
2.在Remote Data控件DataSourceName属性的下拉列表中选择一个ODBC数据源。例如pubs。
3.在Remote Data控件的SQL属性中输入SQL查询语句。例如,Select * from pub_info。
2.3 绑定OLE和Remote Data控件实现图像数据的存储与编辑
OLE是允许应用程序相互之间交换和显示数据的一项技术,使用OLE,可以从支持OLE技术的任何应用程序中读取信息,也可以在任何支持OLE的程序中显示和编辑它。在Visual Basic中,可利用OLE容器控件与Remote Data控件的绑定,来实现显示、存储和编辑SQL Serve数据库中的image类型数据。
1.显示SQL Serve数据库image类型字段的图像数据
具体步骤如下:
(1)在加入了Remote Data控件的Visual Basic的窗体中,添加一个OLE容器控件。创建OLE容器控件时,会出现“插入对象‟:对话框,此时点击“取消”按钮,不必为该容器指定对象。
(2)将OLE容器控件的DataSource属性设置为Remote Data控件的名字,实现控件的绑定。
(3)在OLE容器控件。DataField属性的下拉列表中选择要显示的字段名。例如,logo。
(4)运行应用程序。对于包含image数据类型的logo字段的数据将在OLE容器控件中显示一幅图像。
2.在SQL Sever数据库image类型字段中添加存储图像数据
具体步骤如下:
(1)将Remote Data控件的EOFAction属性设置为rdAddNew,实现数据库的数据添加功能。
(2)在Visual Baisic的窗体中添加一个CommandButton控件,并编写图像文件嵌入OLE容器控件的程序代码。例如:
Private Sub Command_Click()
OLEl.CreateEmbed“c:\图片.bmp” End Sub
(3)运行应用程序,点击Remote Data控件的记录指示按钮,移动到新的记录,然后点击CommandButton控件按钮,实现图像数据的添加入库操作。
3.编辑SQL Serve数据库image数据类型字段的图像数据
具体步骤如下:
(1)在Visual Basic的窗体中添加一个CommandButton控件,编写对OLE对象的编辑程序代码。例如:
Private Sub Command2--_Click()
OLEl.DoVerb VbOLEOpen End Sub
(2)运行应用程序,点击Remote Data控件的记录指示按钮,
选择需要编辑的图像,然后点击CommandButton控件按钮,在分隔的应用程序窗口打开对象,进行图像的编辑操作。
4、图像文件自动入库方式的实现
在数据库的实际应用中,经常需要将图像文件批量存储,以提高数据入库操作的自动化程度。对于图像文件批量存储,在程序代码的编写中,可充分利用OLE容器控件与RemoteData控件的诸多属性和方法,加以实现。
具体步骤如下:
(1)将OLE和RemoteData控件的Visible属性设置成False,使OLE和RemoteData控件不可视。
(2)建立图像文件的批处理文件。
(3)编写以下基本代码,实现批处理功能。
Private Sub Command3_Click()
Dim FileName As String
Open \"c:\tesffile.txt\"ForlnputAs#1'打开批处理文件。
DoWhileNotEOF(1)'循环至文件尾。
Input#l,FileName'读入图像文件名。
MSRDCl.Resultset.AddNew„结果集添加记录
OLEl.CreateEmbedFileName„嵌入图像文件
MSRDCl.Resultset.Update Loop Close #1 End Sub
(4)运行应用程序。点击CommandButton控件按钮,完成图像文件的自动入库。
五、结束语
随着SQL Serve数据库管理系统功能的不断增强、性能的不断完善,将各类数据完全由数据库管理系统统一存储和管理,已成为技术发展的趋势。只有这样,SQL Serve数据库管理系统的强大功能才能得到充分发挥,数据的安全性才能得到充分的保障,使得诸如数据库复制、数据的转移等许多工作,变得非常简单容易。
SQL Server数据库技术(13)
在计算机中数据有两种特征:类型和长度。所谓数据类型就是以数据的表现方式和存储方式来划分的数据的种类。
在SQL Server 中每个变量、参数、表达式等都有数据类型。系统提供的数据类型分为几大类,如表4-2 所示。
其中,BIGINT、 SQL_VARIANT 和TABLE 是SQL Server 2000 中新增加的3 种数据类型。下面分类讲述各种数据类型。
4.3.1 整数数据类型
整数数据类型是最常用的数据类型之一。 1、INT (INTEGER)
INT (或INTEGER)数据类型存储从-2的31次方 (-2 ,147 ,483 ,8) 到2的31次方-1 (2 ,147 ,483,7) 之间的所有正负整数。每个INT 类型的数据按4 个字节存储,其中1 位表示整数值的正负号,其它31 位表示整数值的长度和大小。 2、SMALLINT
SMALLINT 数据类型存储从-2的15次方( -32, 768) 到2的15次方-1( 32 ,767 )之间的所有正负整数。每个SMALLINT 类型的数据占用2 个字节的存储空间,其中1 位表示整数值的正负号,其它15 位表示整数值的长度和大小。 3、TINYINT
TINYINT数据类型存储从0 到255 之间的所有正整数。每个TINYINT类型的数据占用1 个字节的存储空间。
4、BIGINT
BIGINT 数据类型存储从-2^63 (-9 ,223, 372, 036, 854, 775, 807) 到2^63-1( 9, 223, 372, 036 ,854 ,775, 807) 之间的所有正负整数。每个BIGINT 类型的数据占用8个字节的存储空间。
4.3.2 浮点数据类型
浮点数据类型用于存储十进制小数。浮点数值的数据在SQL Server 中采用上舍入(Round up 或称为只入不舍)方式进行存储。所谓上舍入是指,当(且仅当)要舍入的数是一个非零数时,对其保留数字部分的最低有效位上的数值加1 ,并进行必要的进位。若一个数是上舍入数,其绝对值不会减少。如:对3.141592653579 分别进行2 位和12位舍入,结果为3.15 和3.141592653590。 1、REAL 数据类型
REAL数据类型可精确到第7 位小数,其范围为从-3.40E -38 到3.40E +38。 每个REAL类型的数据占用4 个字节的存储空间。 2、FLOAT
FLOAT数据类型可精确到第15 位小数,其范围为从-1.79E -308 到1.79E +308。 每个FLOAT 类型的数据占用8 个字节的存储空间。 FLOAT数据类型可写为FLOAT[ n ]的形式。n 指定FLOAT 数据的精度。n 为1到15 之间的整数值。当n 取1 到7 时,实际上是定义了一个REAL 类型的数据,系统用4 个字节存储它;当n 取8 到
15 时,系统认为其是FLOAT 类型,用8 个字节存储它。 3、DECIMAL
DECIMAL数据类型可以提供小数所需要的实际存储空间,但也有一定的,您可以用2 到17 个字节来存储从-10的38次方-1 到10的38次方-1 之间的数值。可将其写为DECIMAL[ p [s] ]的形式,p 和s 确定了精确的比例和数位。其中p 表示可供存储的值的总位数(不包括小数点),缺省值为18; s 表示小数点后的位数,缺省值为0。 例如:decimal (15 5),表示共有15 位数,其中整数10 位,小数5。 位表4-3 列出了各精确度所需的字节数之间的关系。
4、NUMERIC
NUMERIC数据类型与DECIMAL数据类型完全相同。 注意:SQL Server 为了和前端的开发工具配合,其所支持的数据精度默认最大为28位。但可以通过使用命令来执行sqlserver.exe程序以启动SQL Server,可改变默认精度。命令语法如下:
SQLSERVR[/D master_device_path][/P precisim_leve1] 例4-4: 用最大数据精度38 启动SQL Server sqlservr /d c:\\ Mssql2000\\data\\master.dat /p38
/*在使用了/P 参数后,如果其后没有指定具体的精度数值,则默认为38 位./*
4.3.3 二进制数据类型 1、BINARY
BINARY 数据类型用于存储二进制数据。其定义形式为BINARY( n), n 表示数据的长度,取值为1 到8000 。在使用时必须指定BINARY 类型数据的大小,至少应为1 个字节。BINARY 类型数据占用n+4 个字节的存储空间。在输入数据时必须在数据前加上字符“0X” 作为二进制标识,如:要输入“abc ”则应输入“0xabc ”。若输入的数据过长将会截掉其超出部分。若输入的数据位数为奇数,则会在起始符号“0X ”后添加一个0,如上述的“0xabc ”会被系统自动变为“0x0abc”。 2、VARBINARY
VARBINARY数据类型的定义形式为VARBINARY(n)。 它与BINARY 类型相似,n 的取值也为1 到8000, 若输入的数据过长,将会截掉其超出部分。不同的是VARBINARY数据类型具有变动长度的特性,因为VARBINARY数据类型的存储长度为实际数值长度+4个字节。当BINARY数据类型允许NULL 值时,将被视为
VARBINARY数据类型。
一般情况下,由于BINARY 数据类型长度固定,因此它比VARBINARY 类型的处理速度快。
4.3.4 逻辑数据类型
BIT: BIT数据类型占用1 个字节的存储空间,其值为0 或1 。如果输入0 或1 以外的值,将被视为1。 BIT 类型不能定义为NULL 值(所谓NULL 值是指空值或无意义的值)。
4.3.5 字符数据类型
字符数据类型是使用最多的数据类型。它可以用来存储各种字母、数字符号、特殊符号。一般情况下,使用字符类型数据时须在其前后加上单引号’或双引号” 。 1 CHAR
CHAR 数据类型的定义形式为CHAR[ (n) ]。 以CHAR 类型存储的每个字符和符号占一个字节的存储空间。n 表示所有字符所占的存储空间,n 的取值为1 到8000, 即可容纳8000 个ANSI 字符。若不指定n 值,则系统默认值为1。 若输入数据的字符数小于n,则系统自动在其后添加空格来填满设定好的空间。若输入的数据过长,将会截掉其超出部分。 2、NCHAR
NCHAR数据类型的定义形式为NCHAR[ (n) ]。 它与CHAR
类型相似。不同的是NCHAR数据类型n 的取值为1 到4000。 因为NCHAR 类型采用UNICODE 标准字符集(CharacterSet)。 UNICODE 标准规定每个字符占用两个字节的存储空间,所以它比非UNICODE 标准的数据类型多占用一倍的存储空间。使用UNICODE 标准的好处是因其使用两个字节做存储单位,其一个存储单位的容纳量就大大增加了,可以将全世界的语言文字都囊括在内,在一个数据列中就可以同时出现中文、英文、法文、德文等,而不会出现编码冲突。
3、VARCHAR
VARCHAR数据类型的定义形式为VARCHAR [ (n) ]。 它与CHAR 类型相似,n 的取值也为1 到8000, 若输入的数据过长,将会截掉其超出部分。不同的是,VARCHAR数据类型具有变动长度的特性,因为VARCHAR数据类型的存储长度为实际数值长度,若输入数据的字符数小于n ,则系统不会在其后添加空格来填满设定好的空间。
一般情况下,由于CHAR 数据类型长度固定,因此它比VARCHAR 类型的处理速度快。 4、NVARCHAR
NVARCHAR数据类型的定义形式为NVARCHAR[ (n) ]。 它与VARCHAR 类型相似。不同的是,NVARCHAR数据类型采用UNICODE 标准字符集(Character Set), n 的取值为1 到4000。
4.3.6 文本和图形数据类型
这类数据类型用于存储大量的字符或二进制数据。 1、TEXT
TEXT数据类型用于存储大量文本数据,其容量理论上为1 到2的31次方-1 (2, 147, 483, 7)个字节,在实际应用时需要视硬盘的存储空间而定。
SQL Server 2000 以前的版本中,数据库中一个TEXT 对象存储的实际上是一个指针,它指向一个个以8KB (8192 个字节)为单位的数据页(Data Page)。 这些数据页是动态增加并被逻辑链接起来的。在SQL Server 2000 中,则将TEXT 和IMAGE 类型的数据直接存放到表的数据行中,而不是存放到不同的数据页中。 这就减少了用于存储TEXT 和IMA- GE 类型的空间,并相应减少了磁盘处理这类数据的I/O 数量。 2 NTEXT
NTEXT数据类型与TEXT.类型相似不同的,是NTEXT 类型采用UNICODE 标准字符集(Character Set), 因此其理论容量为230-1(1, 073, 741, 823)个字节。 3 IMAGE
IMAGE数据类型用于存储大量的二进制数据Binary Data。 其理论容量为2的31次方-1(2,147,483,7)个字节。其存储数据的模式与TEXT 数据类型相同。通常用来存储图形等OLE Object Linking and Embedding,对象连接和嵌入)对象。在输入数据时同BINARY数据
类型一样,必须在数据前加上字符“0X”作为二进制标识
4.3.7 日期和时间数据类型 1 DATETIME
DATETIME 数据类型用于存储日期和时间的结合体。它可以存储从公元1753 年1 月1 日零时起到公元9999 年12 月31 日23 时59 分59 秒之间的所有日期和时间,其精确度可达三百分之一秒,即3.33 毫秒。DATETIME 数据类型所占用的存储空间为8 个字节。其中前4 个字节用于存储1900 年1 月1 日以前或以后的天数,数值分正负,正数表示在此日期之后的日期,负数表示在此日期之前的日期。后4 个字节用于存储从此日零时起所指定的时间经过的毫秒数。如果在输入数据时省略了时间部分,则系统将12:00:00:000AM作为时间缺省值:如果省略了日期部分,则系统将1900 年1 月1 日作为日期缺省值。
2 SMALLDATETIME
SMALLDATETIME 数据类型与DATETIME 数据类型相似,但其日期时间范围较小,为从1900 年1 月1 日到2079 年6 月6:日精度较低,只能精确到分钟,其分钟个位上为根据秒数四舍五入的值,即以30 秒为界四舍五入。如:DATETIME 时间为14:38:30.283 时SMALLDATETIME 认为是14:39:00 SMALLDATETIME 数据类型使用4 个字节存储数据。其中前2 个字节存储从基础日期1900 年1 月1 日以来的天数,后两个字节存储此日零时起所指定的时间
经过的分钟数。
下面介绍日期和时间的输入格式 日期输入格式
日期的输入格式很多大致可分为三类:
英文+数字格式
此类格式中月份可用英文全名或缩写,且不区分大小写;年和月日之间可不用逗号;
年份可为4 位或2 位;当其为两位时,若值小于50 则视为20xx 年,若大于或等于50 则
视为19xx 年;若日部分省略,则视为当月的1号。以下格式均为正确的日期格式:
June 21 2000 Oct 1 1999 January 2000 2000 February 2000 May 1 2000 1 Sep 99 June July 00 数字+分隔符格式
允许把斜杠(/)、连接符(-)和小数点(.)作为用数字表示的年、月、日之间的分 隔符。如:
YMD:2000/6/22 2000-6-22 2000.6.22 MDY:3/5/2000 3-5-2000 3.5.2000 DMY:31/12/1999 31-12-1999 31.12.2000 纯数字格式
纯数字格式是以连续的4 位6、位或8 位数字来表示日期。如果输入的是6 位或8 位
数字,系统将按年、月、日来识别,即YMD 格式,并且月和日都是用两位数字来表示:
如果输入的数字是4 位数,系统认为这4 位数代表年份,其月份和日缺省为此年度的1 月 1 日。如:
20000601---2000 年6 月1 日 991212---1999 年12 月12 日 1998---1998 年 ???? 时间输入格式
在输入时间时必须按“小时、分钟、秒、毫秒”的顺序来输入。在其间用冒号“:”隔开。但可将毫秒部分用小数点“.” 分,隔其后第一位数字代表十分之一秒,第二位数字代表百分之一秒,第三位数字代表千分之一秒。当使用12 小时制时用AM。am 和PM(pm)分别指定时间是午前或午后,若不指定,系统默认为AM。AM 与PM 均不区分大小写。如:
3:5:7.2pm---下午3 时5 分7 秒200 毫秒 10:23:5.123Am---上午10 时23 分5 秒123 毫秒
可以使用SET DATEFORMAT 命令来设定系统默认的日期-时间格式。
4.3.8 货币数据类型
货币数据类型用于存储货币值。在使用货币数据类型时,应在数据前加上货币符号,系统才能辨识其为哪国的货币,如果不加货币符号,则默认为“¥”。各货币符号如图4-2所示。 1 MONEY
MONEY 数据类型的数据是一个有4 位小数的DECIMAL 值,其取值从-2的63次方(-922,337,203,685,477.5808到2的63次方-1(+922,337,203,685,477.5807),数据精度为万分之一货币单位。MONEY 数据类型使用8个字节存储。
2 SMALLMONEY
SMALLMONEY数据类型类似于MONEY 类型,但其存储的货币值范围比MONEY数据类型小,其取值从-214,748.38到+214,748.37,存储空间为4 个字节。
4.3.9 特定数据类型
SQL Server 中包含了一些用于数据存储的特殊数据类型。 1 TIMESTAMP
TIMESTAMP数据类型提供数据库范围内的惟一值此类型相当于BINARY8或VARBINARY(8),但当它所定义的列在更新或插入数据行时,此列的值会被自动更新,一个计数值将自动地添加到此TIMESTAMP数据列中。每个数据库表中只能有一个TIMESTAMP数据列。如果建立一个名为“TIMESTAMP”的列,则该列的类型将被自动设为TIMESTAMP数据类型。
2 UNIQUEIDENTIFIER
UNIQUEIDENTIFIER 数据类型存储一个16 位的二进制数字。此数字称为(GUIDGlobally Unique Identifier ,即全球惟一鉴别号)。此数字由SQLServer 的NEWID函数产生的全球惟一的编码,在全球各地的计算机经由此函数产生的数字不会相同。
4.3.10 用户自定义数据类型
SYSNAME SYSNAME 数据类型是系统提供给用户的,便于用户自定义数据类型。它被定义为NVARCHAR(128),即它可存储128个UNICODE字符或256个一般字符。其具体使用方法请参见第7章“管理数据库表”中的“自定义数据类型”章节。
4.3.11 新数据类型
SQL Server 2000 中增加了3 种数据类型:BIGINT、SQL_VARIANT和TABLE。其中BIGINT数据类型已在整数类型中
介绍,下面介绍其余两种: 1 SQL_VARIANT
SQL_VARIANT数据类型可以存储除文本、图形数据(TEXT、NTEXT、IMAGE)和TIMESTAMP类型数据外的其它任何合法的SQL Server数据。此数据类型大大方便了SQL Server的开发工作。 2 TABLE
TABLE 数据类型用于存储对表或视图处理后的结果集。这一新类型使得变量可以存储一个表,从而使函数或过程返回查询结果更加方便快、捷其、使用请参见第13章“游标、视图和自定义函数”。
SQL Server存储图像数据的策略与方法
2003-01-13· ·郑浩 张蔚··yesky
上一页 1 2
二、 存储图像数据的方法
1 建立具有image宇段的SQL Server数据库
当需要在SQL Server数据库中存储图像数据时,首先应建立包含image数据类型字段的数据库关系表。SQL Server数据库平台支持的数据类型中,image数据类型主要用于存储图像数据等大段的二进制数据。SQL Server 7.0之后的版本,image类型可存储2GB的数据。
2 使用Remote Data控件建立与数据库的连接
Remote Data控件是在Visual Basic应用程序中用来获取远程数据的控件。它在.远程数据对象(RDO)和数据绑定控件之间提供了接口,只要给它提供有关数据存储的位置、获取的数据和一些接口控制,就可以连接到数据库,实现对数据库的基本操作。
使用Remote Data控件建立与远程数据库的连接步骤如下:
1.在Visual Basic的窗体中加入一个Remote Data控件。 ,
2.在Remote Data控件DataSourceName属性的下拉列表中选择一个ODBC数据源。例如pubs。
3.在Remote Data控件的SQL属性中输入SQL查询语句。
例如,Select * from pub_info。
2.3 绑定OLE和Remote Data控件实现图像数据的存储与编辑
OLE是允许应用程序相互之间交换和显示数据的一项技术,使用OLE,可以从支持OLE技术的任何应用程序中读取信息,也可以在任何支持OLE的程序中显示和编辑它。在Visual Basic中,可利用OLE容器控件与Remote Data控件的绑定,来实现显示、存储和编辑SQL Serve数据库中的image类型数据。
1.显示SQL Serve数据库image类型字段的图像数据
具体步骤如下:
(1)在加入了Remote Data控件的Visual Basic的窗体中,添加一个OLE容器控件。创建OLE容器控件时,会出现“插入对象’:对话框,此时点击“取消”按钮,不必为该容器指定对象。
(2)将OLE容器控件的DataSource属性设置为Remote Data控件的名字,实现控件的绑定。
(3)在OLE容器控件。DataField属性的下拉列表中选择要显示的字段名。例如,logo。
(4)运行应用程序。对于包含image数据类型的logo字段的数据将在OLE容器控件中显示一幅图像。
2.在SQL Sever数据库image类型字段中添加存储图像数据
具体步骤如下:
(1)将Remote Data控件的EOFAction属性设置为rdAddNew,实现数据库的数据添加功能。
(2)在Visual Baisic的窗体中添加一个CommandButton控件,并编写图像文件嵌入OLE容器控件的程序代码。例如:
Private Sub Command_Click()
OLEl.CreateEmbed“c:\图片.bmp” End Sub
(3)运行应用程序,点击Remote Data控件的记录指示按钮,移动到新的记录,然后点击CommandButton控件按钮,实现图像数据的添加入库操作。
3.编辑SQL Serve数据库image数据类型字段的图像数据
具体步骤如下:
(1)在Visual Basic的窗体中添加一个CommandButton控件,编写对OLE对象的编辑程序代码。例如:
Private Sub Command2--_Click()
OLEl.DoVerb VbOLEOpen
End Sub
(2)运行应用程序,点击Remote Data控件的记录指示按钮,选择需要编辑的图像,然后点击CommandButton控件按钮,在分隔的应用程序窗口打开对象,进行图像的编辑操作。
4、图像文件自动入库方式的实现
在数据库的实际应用中,经常需要将图像文件批量存储,以提高数据入库操作的自动化程度。对于图像文件批量存储,在程序代码的编写中,可充分利用OLE容器控件与RemoteData控件的诸多属性和方法,加以实现。
具体步骤如下:
(1)将OLE和RemoteData控件的Visible属性设置成False,使OLE和RemoteData控件不可视。
(2)建立图像文件的批处理文件。
(3)编写以下基本代码,实现批处理功能。
Private Sub Command3_Click()
Dim FileName As String
Open \"c:\tesffile.txt\"ForlnputAs#1'打开批处理文件。
DoWhileNotEOF(1)'循环至文件尾。
Input#l,FileName'读入图像文件名。
MSRDCl.Resultset.AddNew‘结果集添加记录
OLEl.CreateEmbedFileName‘嵌入图像文件
MSRDCl.Resultset.Update Loop Close #1 End Sub
(4)运行应用程序。点击CommandButton控件按钮,完成图像文件的自动入库。
五、结束语
随着SQL Serve数据库管理系统功能的不断增强、性能的不断完善,将各类数据完全由数据库管理系统统一存储和管理,已成为
技术发展的趋势。只有这样,SQL Serve数据库管理系统的强大功能才能得到充分发挥,数据的安全性才能得到充分的保障,使得诸如数据库复制、数据的转移等许多工作,变得非常简单容易。
用于存储大型非 Unicode 字符、Unicode 字符及二进制数据的固定长度数据类型和可变长度数据类型。Unicode 数据使用 UNICODE UCS-2 字符集。 ntext
长度可变的 Unicode 数据,最大长度为 2^30 - 1 (1,073,741,823) 个字符。存储大小是所输入字符个数的两倍(以字节为单位)。ntext 的 SQL 2003 同义词为 national text。
text
服务器代码页中长度可变的非 Unicode 数据,最大长度为 2^31-1 (2,147,483,7) 个字符。当服务器代码页使用双字节字符时,存储仍是 2,147,483,7 字节。根据字符串,存储大小可能小于 2,147,483,7 字节。
image
长度可变的二进制数据,从 0 到 2^31-1 (2,147,483,7) 个字节。
备注
以下函数和语句可与 ntext、text 或 image 数据一起使用。 函数 DATALENGTH PATINDEX SUBSTRING TEXTPTR TEXTVALID
SQL Server存储图像数据的策略与方法
浏览选项: 大中小 颜色 默认 灰度 橄榄色 绿色 蓝色 褐色 红色
目前对于图像数据的管理大都采用表+实体的方法,即图像数据以文件形式存放于指
定的计算机目录下,在数据库表中只反映图像数据文件的存储路径。这种管理模式,给数据的
维护增加了难度,同时,也给数据的安全带来一定的隐患。因此,
语句 READTEXT SET TEXTSIZE UPDATETEXT WRITETEXT 要真正做到各类数据在数据
库中安全管理,研究和探索直接将图像数据存储在数据库关系表中的方法是非常必要的。
笔者在Visual Basic 6.0开发环境中,采用客户机/服务器的工作方式,针对SQL
Server数据库关系表中存储图像数据的问题进行了初步探讨,提出了一套基本解决方案,供读 一、 存储图像数据的策略
图像数据库技术一直致力于解决海量数字图像的有效存储和管理问题。它是数据库技
术的继承和发展,一方面,图像数据和文本数据存在着本质的区别,在文本数据领域得以成功
应用的传统数据库技术,如果一成不变的照搬到图像数据库领域,结果往往是低效,甚至无效
;另一方面,传统数据库的许多成果,如SQL语言、索引技术等都值得图像数据库借鉴。上述 1.1 BLOB数据类型
BLOB是非常巨大的不定的二进制或者字符型数据,通常是文档(.txt、.doc)和图片
(.jpeg、.gif、.bmp),它可以存储在数据库中。在SQL Server中,BLOB可以是text、
ntext或者image数据类型。 Image数据类型存储的是长度不确定
的二进制数据,最大长度是
BLOB数据在SQL Server系统中的存储方式不同于普通的数据类型,对于普通类型的数
据系统直接在用户定义的字段上存储数据值,而对于BLOB类型数据,系统开辟新的存储页面来
存放这些数据,表中BLOB类型数据字段存放的仅是一个16个字节的指针,该指针指向存放该条 1.2 BLOB的设计策略
BLOB数据是数据量很大的数据类型,它会占用大量的硬盘空间、内存和网络资源,因
此合理地设计包含有BLOB数据类型的属性表,对提高存储效率、查询速度有很大的影响。一般
(1) 使用BLOB数据类型还是使用varchar或者varbinary数据类型
二进制大对象并不一定要存储为text、ntext或者image数据类型,它们也可以作为
varchar或者varbinary数据类型村处在表格中。数据类型的选择要根据将要存储的BLOB的实际
大小。如果数据不会超过8K,那么就使用Varchar或者varbinary数据类型。如果这些大对象的
(2) 存储BLOB在数据库中或者在文件系统中
常见的设计问题是将图片存在数据库中还是存在文件系统中。
在大多数情况下,最好
把图片文件与其它数据一起存在数据库中。因为将影像数据文件存储在数据库中有许多优点:
易于管理 当BLOB与其他数据一起存储在数据库中时,BLOB和表格是数据一起备份和
恢复。这样就降低了表格数据与BLOB数据不同步的机会,而且降低了其他用户无意中删除了文
件系统中BLOB数据位置的路径和风险。另外,将数据存储在数据库中BLOB和其他数据的插入、
更新和删除都在同一个事务中实现。这样就确保了数据的一致性和文件与数据库之间的一致性
。还有一点好处是不需要为文件系统中的文件单独设置安全性。 可伸缩性 尽管文件系统被设计为能够处理大量不同大小的对象,但是文件系统不能
对大量小文件进行优化。在这种情况下,数据库系统可以进行优化。
可用性 数据库具有比文件系统更多的可用性。数据库复制允许在分布式环境中复制
、分配和潜在的修改数据。在主系统失效的情况下,日志转移提供了保留数据库备用副本的方
当然,在某些情况下,将图片存储在文件系统中将是更好的选择:
(1)使用图片的应用程序需要数据流性能,例如实时的视频重现。
(2)象Microsoft PhotoDraw或者Adobe Photoshop这样的应用程序经常访问BLOB,
(3)需要使用一些NTFS文件系统中的特殊功能,例如远程存储。
二、 存储图像数据的方法
1 建立具有image宇段的SQL Server数据库
当需要在SQL Server数据库中存储图像数据时,首先应建立包含image数据类型字段
的数据库关系表。SQL Server数据库平台支持的数据类型中,image数据类型主要用于存储图
像数据等大段的二进制数据。SQL Server 7.0之后的版本,image类型可存储2GB的数据。
2 使用Remote Data控件建立与数据库的连接
Remote Data控件是在Visual Basic应用程序中用来获取远程数据的控件。它在.远
程数据对象(RDO)和数据绑定控件之间提供了接口,只要给它提供有关数据存储的位置、获取
的数据和一些接口控制,就可以连接到数据库,实现对数据库的基本操作。
使用Remote Data控件建立与远程数据库的连接步骤如下:
1.在Visual Basic的窗体中加入一个Remote Data控件。 , 2.在Remote Data控件DataSourceName属性的下拉列表中选择一个ODBC数据源。例如
3.在Remote Data控件的SQL属性中输入SQL查询语句。例如,Select * from
2.3 绑定OLE和Remote Data控件实现图像数据的存储与编辑 OLE是允许应用程序相互之间交换和显示数据的一项技术,使用OLE,可以从支持OLE
技术的任何应用程序中读取信息,也可以在任何支持OLE的程序中显示和编辑它。在Visual
Basic中,可利用OLE容器控件与Remote Data控件的绑定,来实现显示、存储和编辑SQL
1.显示SQL Serve数据库image类型字段的图像数据 具体步骤如下:
(1)在加入了Remote Data控件的Visual Basic的窗体中,添加一个OLE容器控件。创
建OLE容器控件时,会出现“插入对象’:对话框,此时点击“取消”按钮,不必为该容器指
(2)将OLE容器控件的DataSource属性设置为Remote Data控件的名字,实现控件的绑
(3)在OLE容器控件。DataField属性的下拉列表中选择要显示的字段名。例如,logo
(4)运行应用程序。对于包含image数据类型的logo字段的数据将在OLE容器控件中显
2.在SQL Sever数据库image类型字段中添加存储图像数据 具体步骤如下:
(1)将Remote Data控件的EOFAction属性设置为rdAddNew,实现数据库的数据添加功
(2)在Visual Baisic的窗体中添加一个CommandButton控件,并编写图像文件嵌入OLE
Private Sub Command_Click()
OLEl.CreateEmbed“c:\图片.bmp” End Sub
(3)运行应用程序,点击Remote Data控件的记录指示按钮,移动到新的记录,然后点
击CommandButton控件按钮,实现图像数据的添加入库操作。 3.编辑SQL Serve数据库image数据类型字段的图像数据 具体步骤如下:
(1)在Visual Basic的窗体中添加一个CommandButton控件,编写对OLE对象的编辑程
Private Sub Command2--_Click() OLEl.DoVerb VbOLEOpen End Sub
(2)运行应用程序,点击Remote Data控件的记录指示按钮,选
择需要编辑的图像,
然后点击CommandButton控件按钮,在分隔的应用程序窗口打开对象,进行图像的编辑操作。
4、图像文件自动入库方式的实现
在数据库的实际应用中,经常需要将图像文件批量存储,以提高数据入库操作的自动
化程度。对于图像文件批量存储,在程序代码的编写中,可充分利用OLE容器控件与
RemoteData控件的诸多属性和方法,加以实现。 具体步骤如下:
(1)将OLE和RemoteData控件的Visible属性设置成False,使OLE和RemoteData控件不
(2)建立图像文件的批处理文件。 (3)编写以下基本代码,实现批处理功能。 Private Sub Command3_Click() Dim FileName As String
Open \"c:\tesffile.txt\"ForlnputAs#1'打开批处理文件。 DoWhileNotEOF(1)'循环至文件尾。 Input#l,FileName'读入图像文件名。 MSRDCl.Resultset.AddNew‘结果集添加记录 OLEl.CreateEmbedFileName‘嵌入图像文件 MSRDCl.Resultset.Update
Loop Close #1 End Sub
(4)运行应用程序。点击CommandButton控件按钮,完成图像文件的自动入库。 五、结束语
随着SQL Serve数据库管理系统功能的不断增强、性能的不断完善,将各类数据完全
由数据库管理系统统一存储和管理,已成为技术发展的趋势。只有这样,SQL Serve数据库管
理系统的强大功能才能得到充分发挥,数据的安全性才能得到充分的保障,使得诸如数据库复
制、数据的转移等许多工作,变得非常简单容易。
关于ntext、text 和 image 数据
--------------------------------------------------------------------------------
作者:佚名 点击数: 更新时间:2005-1-26
管理 ntext、text 和 image 数据 Microsoft?SQL Server\"! 的 ntext、text 和 image 数据类型在单个值中可以包含非常大的数据量
(最大可
达 2 GB)。单个数据值通常比应用程序在一个步骤中能够检索的大;某些值可能还会大于客户端的可用虚拟内存。因此,
在检索这些值时,通常需要一些特殊的步骤。
如果 ntext、text 和 image 数据值不超过 Unicode 串、字符串或二进制串的长度(分别为 4,000 个字符、8,000 个字
符和 8,000 个字节),就可以在 SELECT、UPDATE 和 INSERT 语句中引用它们,其引用方式与较小的数据类型相同。例
如,包含短值的 ntext 列可以在 SELECT 语句的选择列表中引用,这与 nvarchar 列的引用方式相同。引用时必须遵守一
些,例如不能在 WHERE 子句中直接引用 ntext、text 或 image 列。这些列可以作为返回其它数据类型(例如
ISNULL、SUBSTRING 或 PATINDEX)的某个函数的参数包含
在 WHERE 子句中,也可以包含在 IS NULL、IS NOT NULL 或
LIKE 表达式中。
处理较大的数据值
但是,如果 ntext、text 和 image 数据值较大,则必须逐块处理。Transact-SQL 和数据库 API 均包含使应用程序可以
逐块处理 ntext、text 和 image 数据的函数。
数据库 API 按照一种通用的模式处理长 ntext、text 和 image 列:
若要读取一个长列,应用程序只需在选择列表中包含 ntext、text 或 image 列,并将该列绑定到一个程序变量,该变量
应足以容纳适当的数据块。然后,应用程序就可以执行该语句,并使用 API 函数或方法将数据逐块检索到绑定的变量中。
若要写入一个长列,应用程序可使用参数标记 (?) 在相应位置代替 ntext、text 或 image 列中的值,以执行 INSERT
或 UPDATE 语句。参数标记(对 ADO 而言则为参数)被绑定到一个足以容纳数据块的程序变量上。应用程序进入循环,在
循环中先将下一组数据移到绑定的变量中,然后调用 API 函数或方法写入数据块。这一过程将反复进行,直到整个数据值
发送完毕。
使用 text in row
在 Microsoft SQL Server 2000 中,用户可以在表上启用 text in
row 选项,以使该表能够在其数据行中存储 text、
ntext 或 image 数据。
若要启用该选项,请执行 sp_tableoption 存储过程,将 text in row 指定为选项名并将 on 指定为选项值。BLOB(二进
制大对象:text、ntext 或 image 数据)行中可以存储的默认最大大小为 256 字节,但是值的范围可以从 24 到 7000。
若要指定默认值以外的最大大小,请指定该范围内的整数作为选项值。
如果应用下列条件,则将 text、ntext 或 image 字符串存储在数据行中:
启用 text in row。
字符串的长度比 @OptionValue 所指定的短
数据行中有足够的可用空间。
当 BLOB 字符串存储在数据行中时,读取和写入 text、ntext 或 image 字符串可以与读取或写入字符串和二进制字符串
一样快。SQL Server 不必访问单独的页以读取或写入 BLOB 字符串。
如果 text、ntext 或 image 字符串比行中所指定的或可用空间大,则将指针存储在该行中。在行中存储 BLOB 字符
串的条件仍然适用,但是:数据行中必须有足够的空间容纳指针。
有关更多信息,请参见 sp_tableoption。
使用文本指针
如果未指定 text in row 选项,text、ntext 或 image 字符串将存储在数据行外;只有这些字符串的文本指针驻留在数
据行中。文本指针指向由内部指针生成的树的根节点,而这些内部指针映射到实际存储(text、ntext 或 image 数据的)
字符串段的页。
SQL Server 2000 中的行文本指针与 SQL Server 早期版本中的文本指针不同。行文本指针的行为就象 BLOB 数据的文件
句柄;早期的文本指针功能则象 BLOB 数据的地址。因此,在使用行文本指针时,请记住下列特性:
重要 虽然游标中允许有行文本,但却不允许有行文本指针。如果尝试声明包含行文本指针的游标,SQL Server 将返回错
误信息(8654、16、1、\"A cursor plan could not be generated for the given statement because it contains
textptr(inrow lob).\"、1033)。
数字
对于每个数据库,每个事务最多允许 1024 个活动行文本指针。 锁定
当用户获取活动文本指针时,SQL Server 2000 在第一个用户控制文本指针时锁定数据行,并确保没有其他用户修改或删
除该行。锁在文本指针变为无效时被释放。若要使文本指针无效,请使用 sp_invalidate_textptr。
当事务的隔离级别是未提交读或者数据库为\"只读\"模式时,文本指针不能用于更新 BLOB 值。
当数据库为\"单用户\"模式时,SQL Server 2000 不锁定数据行。
为举例说明,给出下面的表:
CREATE TABLE t1 (c1 int, c2 text)
EXEC sp_tableoption 't1', 'text in row', 'on'
INSERT t1 VALUES ('1', 'a')
下面的事务将会成功:
INSERT t1 VALUES ('1','This is text.')
SET TRANSACTION ISOLATION LEVEL READ
UNCOMMITTED GO
BEGIN TRAN
DECLARE @ptr varbinary(16)
SELECT @ptr = textptr(c2) FROM t1
WHERE c1 = 1
READTEXT t1.c2 @ptr 0 5
COMMIT TRAN GO
下面的事务将会失败: SET
TRANSACTION
ISOLATION
UNCOMMITTED GO
BEGIN TRAN
DECLARE @ptr varbinary(16)
SELECT @ptr = textptr(c2) FROM t1
WHERE c1 = 1
WRITETEXT t1.c2 @ptr 'xx'
LEVEL
READ
COMMIT TRAN GO
持续时间
行文本指针仅在事务内有效。提交事务时,文本指针变为无效。
在某个事务内,当发生下列任一操作时,行文本指针可能无效:
会话结束。
删除该事务中的数据行。(其它事务无法删除数据行,因为该行包含锁。)
文本指针所在的表的架构已更改。使文本指针无效的架构更改操作包括:创建或除去聚集索引,改变或除去表,截断表,
通过 sp_tableoption 更改 text in row 选项,以及执行 sp_indexoption。
使用前面的示例,下列脚本在 SQL Server 早期版本中有效,但在 SQL Server 2000 中将生成错误。
DECLARE @ptrval varbinary(16)
PRINT 'get error here'
SELECT @ptrval = TEXTPTR(c2) FROM t1
WHERE c1 = 1
READTEXT t1.c2 @ptrval 0 1
在 SQL Server 2000 中,必须在事务内使用行文本指针:
BEGIN TRAN
DECLARE @ptrval varbinary(16)
SELECT @ptrval = TEXTPTR(c2) FROM t1
WHERE c1 = 1
READTEXT t1.c2 @ptrval 0 1
COMMIT
NULL 文本
可以在由 INSERT 生成的 NULL 文本上获得行文本指针。而在以前,只有将 BLOB 更新为 NULL 后才能获得文本指针。
例如,下列代码在 SQL Server 7.0 中无效,但在 SQL Server 2000 中有效。
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
GO
INSERT INTO t1 VALUES (4, NULL)
BEGIN TRAN
DECLARE @ptrval VARBINARY(16)
SELECT @ptrval = TEXTPTR(c2) FROM t1
WHERE c1 = 4
WRITETEXT t1.c2 @ptrval 'x4'
COMMIT
在 SQL Server 7.0 中,必须执行下列操作:
INSERT INTO t1 VALUES (4, NULL)
UPDATE t1
SET c2 = NULL
WHERE c1 = 4
DECLARE @ptrval VARBINARY(16)
SELECT @ptrval = TEXTPTR(c2) FROM t1
WHERE c1 = 4
WRITETEXT t1.c2 @ptrval 'x4'
下表汇总差别。
差别 行文本指针 非行文本指针
数字 对于每个数据库,每个事务最多允许 1024 个活动行文本指针。 无。
锁定 将数据行一直 S 锁定到指针变为无效为止。
当事务为\"未提交读\"或数据库为\"单用户\"或\"只读\"模式时不获取锁。
不锁定数据行。
持续时间 事务或会话结束、删除行或更改表的架构时变为无效。 删除行时变为无效。
NULL 文本 插入 NULL 文本后可立即获取。 只有更新后才能获取。
通过数据库 API 使用 ntext、text 和 image 数据
这一部分概述数据库 API 处理 ntext、text 和 image 数据的方式: ADO
ADO 可以将 ntext、text 或 image 列或参数映射为 Field 或 Parameter 对象。使用 GetChunk 方法逐块检索数据,使
用 AppendChunk 方法逐块写数据。有关更多信息,请参见管理 Long 数据类型。
OLE DB
OLE DB 使用 ISequentialStream 接口支持 ntext、text 和 image 数据类型。ISequentialStream::Read 方法逐块读取
长数据,ISequentialStream::Write 方法将长数据逐块写入数据库。有关更多信息,请参见 BLOB 和 OLE 对象。 ODBC
ODBC 具有一种称为\"执行中的数据\"的功能,可用于处理长数据的 ODBC 数据类型:SQL_WLONGVARCHAR (ntext)、
SQL_LONGVARCHAR (text) 和 SQL_LONGVARBINARY (image)。这些数据类型被绑定到某个程序变量上。这样一来,就可以调
用 SQLGetData 逐块检索长数据,调用 SQLPutData 逐块发送长数据。有关更多信息,请参见管理 text 和 image 列。
DB-Library
DB-Library 应用程序也是将 ntext、text 和 image 列绑定到程序变量上。DB-Library 函数 dbtxtptr 用于获取指向数
据库中长列出现位置的指针,dbreadtext 则用来逐块读取长数据。dbwritetext、dbupdatetext 和 dbmoretext 之类的函
数用于逐块写入长数据。
说明 不支持使用 DB-Library 访问行文本。
如何用VB存取SQL Server中的图像数据
作者:何益斌 高景昌 李小琳 文章来源:吉林大学 点击数:242 更新时间:2005-8-10
摘要 本文介绍MIS SQL Server对图像数据的存储机制和存取方法。针对VB开发工具,介绍了一种通过ADO Field 对象的GetChunk 方法和AppendChunk 方法来存取MIS SQL Server中的图像数据的方法。
关键词 ADO Field对象 BLOB 对象 GetChunk和AppendChunk 方法 image数据类型 医院信息系统
MIS SQL Server
在一个完善的医院信息MIS中,图像数据的存取是必不可少的,比如X光片、CT像片的保存。一方面,这些图像数据在远程诊疗为准确诊断病情提供了重要的依据,另一方面,也为快速查阅病人资料提供了基本条件。图像数据的存取在其它应用系统如GIS中也有广泛的应用。
1、 SQL Server中图像数据的存储机制
在MIS SQL Server 中,对于小于 8000 个字节的图像数据可以用二进制型(binary、varbinary)来表示。但通常要保存的一些医学影像图片都会大于 8000个字节。SQL Server提供了一种机制,能存储每行大到 2G的二进制对象(BLOB),这类对象可包括image、text和ntext三种数据类型。Image数据类型存储的是二进制数据,最大长度是 231-1 (2,147,483,7)个字节[2][3]。
BLOB数据在MIS SQL Server系统中的存储方式不同于普通的数据类型,对于普通类型的数据系统直接在用户定义的字段上存储数据值,而对于BLOB类型数据,系统开辟新的存储页面来存放这些数据,表中BLOB类型数据字段存放的仅是一个16个字节的指针,该指针指向存放该条记录的BLOB数据的页面。
2、 SQL Server中图像数据的存取
在MIS SQL Server中,当数据小于 8000 个字节时,可以用普通的SQL操纵语句(SELECT、INSERT、UPDATE、DELETE)来完成对字段的操纵,当数据大于8000个字节时,SQL提供了 WRITETEXT 、READTEXT和UPDATETEXT这三个函数来读取和修改数据。这三个函数的使用方法为:
(1) WRITETEXT {table.column text_ptr}[WITH LOG] {data}
table.column为表中的字段,text_ptr为一个16个字节的指针,data为要写的数据值。可
选参数WITH LOG表示是否要写入日志文件中。
例: DECLARE @ptrval binary(16) --指针
SELECT @ptrval = TEXTPTR(img_ct) FROM zy_ct WHERE id_ct = 20010101001
WRITETEXT
zy_ct.img_ct
@ptrval
0x024324142342134214213421421454353452341
(2) READTEXT {table.column text_ptr offset size} [HOLDLOCK]
table.column为表中的字段,text_ptr为一个16个字节的指针,offset 为偏移量,即从
第几个字节开始读数据,size为要读的字节数,HOLDLOCK 为在读数据中是否充许其他用户
修改该数据。
例:DECLARE @ptrval varbinary(16)
SELECT @ptrval = TEXTPTR(img_ct) FROM zy_ct WHERE id_ct = 20010101001
READTEXT zy_ct.img_ct @ptrval 1 25 (3)
UPDATETEXT
{table_name.dest_column_name
dest_text_ptr}{NULL|insert_offset} {
NULL
|
delete_length}[WITH
LOG][
inserted_data|
{table_name.src_column_name src_text_ptr}]
table_name.dest_column_name 为要修改的text, ntext, 或 image字段;
dest_text_ptr为指向其的指针;insert_offset为偏移量,对于text和image为从
第几开始字节开始写,对于ntext为从第几个字符(双字节)开始写;delete_length
为从insert_offset开始删除delete_length长度的字节(符),为0时不删除,为NULL时
为删除从insert_offset开始到结束的所有数据。要插入的数据为
inserted_data为,也可
是表table_name的src_column_name字段中指针 src_text_ptr所指数据。
例: DECLARE @ptrval binary(16)
SELECT @ptrval = TEXTPTR(img_ct) FROM zy_ct WHERE id_ct = 20010101001
UPDATETEXT zy_ct.img_ct @ptrval 16 0x54345
可以看出,这三个函数的使用比较复杂,虽然可以通过生成存贮过程来调用执行,但有一个缺陷是在读取数据时,READTEXT函数读取的数据无法直接传递回前端应用程序。
3、 VB 6.0中图像数据的存取
VB 6.0 的ADO Field 对象提供了GetChunk 方法和AppendChunk 方法来存取BLOB数据[1],这两个函数实质是通过API调用WRITETEXT 、READTEXT和UPDATETEXT这三个函数,简化了调用的方法。
(1)GetChunk 和AppendChunk方法介绍
GetChunk 方法检索其部分或全二进制或字符数据[4]。GetChunk 调用返回的数据将赋给“变量”。如果 Size 大于剩余的数据,则 GetChunk 仅返回剩余的数据而无需用空白填充“变量”。如果字段为空,则 GetChunk 方法返回 Null。每个后续的 GetChunk 调用将检索从前一次 GetChunk 调用停止处开始的数据。但是,如果从一个字段检索数据然后在当前记录中设置或读取另一个字段的值,ADO 将认为已从第一个字段中检索出数据。如果在第一个字段上再次调用 GetChunk 方法,ADO 将把调用解释为新的 GetChunk 操作并从记录的起始处开始读取。Field 对象的第一个 AppendChunk 调用将数据写入字段,覆盖所有现有的数据,随后的 AppendChunk 调用则添加到现有数据。
由于系统资源总是有限的,如果一次读(存)取大量数据,可能会引起服务器、客户机死机或是服务器的性能大大下降,因此使用这两个函数时,要将图像数据进行分段读写。
(2)程序实现
程序一:写数据函数
Public Function AppendBlobFromFile(blobColumn As ADODB.Field, ByVal FileName) As Boolean
Dim FileNumber As Integer '文件号
Dim DataLen As Long 件长度
Dim Chunks As Long '数据块数
Dim ChunkAry() As Byte '数据块数组
Dim ChunkSize As Long '数据块大小
Dim Fragment As Long '零碎数据大小
Dim lngI As Long '计数器
On Error GoTo ErrorHandle
'文
AppendBlobFromFile = False
ChunkSize = 2048 '每次读取的块大小为 2K
FileNumber = FreeFile '产生随机的文件号
Open FileName For Binary Access Read As FileNumber '打开图像文件
DataLen = LOF(FileNumber) '获得文件长度
If IsNull(blobColumn) Then Exit Function
If DataLen = 0 Then '文件长度为0
Close FileNumber
AppendBlobFromFile = True
Exit Function End If
Chunks = DataLen \\ ChunkSize
Fragment = DataLen Mod ChunkSize
If Fragment > 0 Then
ReDim ChunkAry(Fragment - 1)
Get FileNumber, , ChunkAry()
blobColumn.AppendChunk ChunkAry 数写数据
'数据块的个数 '先写零碎数据 '读出文件 '调用AppendChunk函 End If
ReDim ChunkAry(ChunkSize - 1) '为数据块开辟空间
For lngI = 1 To Chunks '循环读出所有数据块
Get FileNumber, , ChunkAry() '读出一块数据
blobColumn.AppendChunk ChunkAry '在数据库中增加数据块 Next lngI
Close FileNumber '关闭文件
AppendBlobFromFile = True
Exit Function
ErrorHandle:
AppendBlobFromFile = False
MsgBox Err.Description, vbCritical, \"写图像数据出错!\"
End Function
程序二:读数据函数
Public Function ReadbolbToFile(blobColumn As ADODB.Field, ByVal FileName) As Boolean
Dim FileNumber As Integer '文件号
Dim DataLen As Long '文件长度
Dim Chunks As Long '数据块数
Dim ChunkAry() As Byte '数据块数组
Dim ChunkSize As Long '数据块大小
Dim Fragment As Long '零碎数据大小
Dim lngI As Long '计数器
On Error GoTo ErrorHandle
ReadbolbToFile= False
ChunkSize = 2048 '定义块大小为 2K
If IsNull(blobColumn) Then Exit Function
DataLen = blobColumn.ActualSize '获得图像大小
If DataLen < 8 Then Exit Function '图像大小小于8字节时认为不是图像信息
FileNumber = FreeFile '产生随机的文件号
Open FileName For Binary Access Write As FileNumber '打开存放图像数据文件
Chunks = DataLen \\ ChunkSize '数据块数
Fragment = DataLen Mod ChunkSize '零碎数据
If Fragment > 0 Then '有零碎数据,则先读该数据
ReDim ChunkAry(Fragment - 1)
ChunkAry
=
blobColumn.GetChunk(Fragment)
Put FileNumber, , ChunkAry '写入文件
End If
ReDim ChunkAry(ChunkSize - 1) '为数据块重新开辟空间
For '循环读出所有块
ChunkAry
blobColumn.GetChunk(ChunkSize) '在数据库中连续读数据块
Put FileNumber, , ChunkAry() '将数据块写入文件中
Next lngI
=
lngI
=
1
To
Chunks
Close FileNumber '关闭文件
ReadbolbToFile= True
Exit Function
ErrorHandle:
ReadbolbToFile= False
MsgBox Err.Description, vbCritical, \"读图像数据出错!\"
End Function
当BLOB类型的字段为空时,调用AppendChunk或 GetChunk函数将出错。此时如果想给该字段插入图像数据,应该先使用 Update语句给该字段赋初值如0x0,以便数据库系统为该字段分配一个页面地址来存放BLOB数据。 4、 总结
Microsoft SQL Server为保存大二进制数据提供了存储平台,Visual Basic 6.0为存取这种数据提供了灵活的接口。本文介绍的用VB接口存取 MIS SQL Server中大二进制数据的方法,不但适用于图像文件,同样适用于其它类型的文件。该方法应用于医院管理系统的图像存取中,在存取速度、对系统的性能影响等方面都取了满意的效果。 参考文献
1 [美] Curtis Smith Michael Amundsen .Visual Basic 6.0 数据库编程.陈海林译.北京:清华大学出版社,1998
2 [美] Sharon Bjeletich,Greg Mable .Microsoft SQL Server 7.0 开发指南 熊桂喜 蔡铁岭 译.北京:清华大学出版社 2000
3 SQL SERVER 7.0 数据库系统管理与应用开发 袁鹏飞 人民邮电出版社 1999.9
4 [美] JEFFOEY P.MCMANUS.VISUAL BASIC6数据库访问技术 赵军锁、龚波、李志等译 机械工业出版社 1999
向SQL Server数据库添加图片
作者:孟宪会 文章来源:孟宪会之精彩世界 点击数:106 更新时间:2005-8-10
下面的代码实现向SQL Server数据库添加图片和文字的功能。
首先,在SQL查询分析器中执行下面的语句,以创建表和存储过程。
Drop Table Person Go
Create Table Person (
PersonID Int Identity, PersonEmail Varchar(255), PersonName Varchar(255), PersonSex Char(1), PersonDOB DateTime,
PersonImage Image,
PersonImageType Varchar(255) )
Drop Proc sp_person_isp Go
Create Proc sp_person_isp @PersonEmail Varchar(255), @PersonName Varchar(255), @PersonSex Char(1), @PersonDOB DateTime, @PersonImage Image,
@PersonImageType Varchar(255) As Begin
Insert into Person
(PersonEmail, PersonName, PersonSex, PersonDOB, PersonImage, PersonImageType) Values
(@PersonEmail, @PersonName, @PersonSex, @PersonDOB, @PersonImage, @PersonImageType)
End Go
下面就是完整的代码,拷贝即可运行:
<%@ Import Namespace=\"System.IO\" %>
<%@ Import Namespace=\"System.Data.SqlClient\" %> <%@ Import Namespace=\"System.Data\" %> <%@ Page Language=\"vb\" %>
ColumnSpan=\"2\"
Runat=\"server\"
Text=\"
照
片
\"
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- obuygou.com 版权所有 赣ICP备2024042798号-5
违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务