分享
 
 
 

用SQL Server为Web浏览器提供图像(一)

王朝mssql·作者佚名  2006-11-24
窄屏简体版  字體: |||超大  

微软SQL Server数据库服务器能够在SQL数据库里保存图片和大量的文本。图片和文本使用的数据类型分别是image图片类型和text文本类型。假如使用VB或VC开发前端应用程序,在windows操作系统上运行,那么可以容易地从SQL数据库里提取图片数据,把它放入一个文件,并在屏幕上显示出来。但是,要是想从SQL Server得到图片,并在Web浏览器里显示,就不那么容易了。虽然在微软SQL Server 6.5里提供了Web助理和存储过程 sp_makewebtask、sp_runwebtask,它们能够把SQL数据库里的数据转化成HTML文件,但是我们有更好的解决办法。使用Web助理的一个问题是,它不接受图片数据类型的字段。另一方面,存储过程 sp_makewebtask 的参数太多,很难使用,而且也很难对Web页面进行自定义。

我们在这里提供了一个解决方案,把图片从SQL数据装载到Web浏览器,这个方案要比sp_makewebtask好。我们用一个ActiveX 动态链接库和ASP页面开发了一个Web项目。动态链接库负责打开到保存图片的SQL数据库的连接,从数据库提取图片并把它们保存在临时文件里。ASP和动态链接库进行通信,取得临时图片文件的位置。这样,当访问者点击Web站点时,图片就会下载到他的浏览器。在这篇文章里,我们要介绍设置SQL数据库的步骤。然后,我们还要介绍如何利用VB5和活动数据对象ADO 1.5建立ActiveX动态链接库。最后,我们还要讨论建立ASP Web项目、连接到SQL数据库以及编写ASP文件的处理过程。

设置SQL数据库

这篇文章里使用的数据库非常简单,只包含一个表,名字叫Products,代表普通小杂货店里的各种不同的商品。设置数据库的第一步是建在微软SQL Server里建立一个数据库设备(译者注:在SQL Server 7.0里,数据库设备的概念已经取消) 。虽然可以编写SQL脚本来设置数据库,但是使用SQL企业管理器操作更容易些。打开企业管理器,在树中选择数据库设备(Database Device)。单击鼠标右键,在快捷菜里选择新建设备(New Device)。在名称(Name )字段里,输入Grocevb_dev,把这个设备的大小设置为2MB。然后,单击建立(Create Now ) 按钮,就建立了数据库。接着,用同样的方法建立另一个数据库设备,作为日志文件。给这个设备起名叫Grocevb_log ,把它的大小设置为1MB。

下一步,需要建立一个新的数据库。在树中选择数据库(Database),单击右键。然后,在弹出菜单里选择新建数据库(New Database)。在建立新数据库对话框里,输入数据库名称 grocevb,并从下拉列表里选择前面建立的Grocevb_dev 作为数据设备, Grocevb_log 作为日志设备。然后,单击建立(Create Now)按钮,数据库就建立了。我们暂时忽略有关数据库安全性、数据库备份、用户访问等方面的问题,因为它们跟这篇文章没有直接的关系。

我们建立的数据库只有一个表,表名是Products。在这个表里有几个字段,其中,有两个字段prod_image 和 prod_imagetype 需要特别说明。prod_image 字段的数据类型是image图片,在这个字段里保存某个产品的图片。prod_imagetype 字段保存图片的类型,比如.gif 或 .jpg,这是在互联网上最常用的两种图片类型。这个表的主关键字是prod_id,它是非集簇的索引。这样,每个图片都有一个唯一的 prod_id。在 列表 A里给出了建立 Products 表的SQL脚本。在这个表里,只放了四个产品,用于本文演示。

列表A:建立products表的脚本。

/** 用来建立ImageLoader VB动态链接库使用的产品表。**/

CREATE TABLE Products

(

prod_idintCONSTRAINT pk_prod PRIMARY KEY NONCLUSTERED IDENTITY(1, 1),

categ_idintNULLCONSTRAINT fk_prod REFERENCES categories(categ_id),

prod_namechar(80) NOT NULL UNIQUE NONCLUSTERED,

prod_unitpricemoneyNOT NULL,

prod_unitquantchar(15)NOT NULL,

prod_descvarchar(255) NULL DEFAULT ('unknown'),

prod_imagetypechar(3)NOT NULL,

prod_image imageNOT NULL,)

GO

建立ActiveX 动态链接库

使用 VB 5.0,我们要开发一个ActiveX 动态链接库。这个动态链接库让我们能够连接到SQL数据库,提取图片数据,并把它们保存成文件,放在目录里。要建立动态链接库,请在打开VB程序之后执行下列步骤:首先:在文件(File)菜单里,选择新建项目(New Project)。接着,在新建立项目对话框里,双击ActiveX DLL 图标。VB自动地向项目里增加一个类,叫做Class1。然后,在属性容器里,双击名称(Name)属性,把它改成clsImageLoader,保持instancing 属性为缺省值MultiUse不动。最后,在项目(Project)菜单里,选择Project1 属性,打开项目属性对话框。选择通用(General)选项卡,把项目名称改为ImageLoader。其它字段可以不管,保持原样。单击确定(OK)完成对ImageLoader 这个工程的设置。

在类里,写入了5个Let属性,1个Get属性(只读)和两个方法。Let属性传递动态链接库需要的信息,Get属性提供动态链接库生成的图片文件的位置。两个方法用来打开到数据库的连接,以生成图片文件。表 A 总结了这些属性和方法的作用。当然,根据项目的需要,可以在类里加入更复杂的功能。

表A: 在ActiveX动态链接库里的属性和方法

属性/方法作用

DbName打开数据库连接所需的数据库名称。

TableName,

NameOfImageColumn,打开记录集所需要的信息。

NameOfImageTypeColumn,

NameOfImageIdColumn

ImageFile (只读)把图片文件的名称和位置返回给容器。

OpenConnection (方法) 打开数据库连接。

CreateTemplateImageFile (方法)从数据库提取图片数据,并把它保存到目录里。

在类里还有其它的私有子程序,用来初始化类、终止类、打开记录集、建立图片文件,以及处理可能的错误。

注意微软活动数据对象ADO1.5(现在为2.0)被用来连接SQL数据库。也可以使用其它数据访问方法,比如远程数据对象RDO。在这个项目里,必须使用ADO。操作方法是,单击项目(Project)菜单,然后选择引用(References)菜单 项。在引用对话框里,选中微软ActiveX Data Objects 1.5 库,然后单击确定(OK)。

在列表 B里,列出了类ImageLoader 完整源代码。类里使用的变量定义都在代码内部给出,还有其它注释,帮助理解上下文。

列表 B:类 ImageLoader 的完整源代码

Private mAdoConn As New ADODB.Connection

Private mAdoRst As New ADODB.Recordset

Private mstrDbName As String

Private mstrTableName As String

Private mstrImageColumnName As String '图片字的名称。

Private mstrImageTypeColumnName As String '图片类型字段的名称。

Private mstrImageIdColumnName As String '图片ID字段的名称。

Private mstrFileName() As String '数组,里面包含文件名和路径。

Private mlngImageId() As Long '数组,里面包含图片ID

Private mlngNumberOfFiles As Long

Const BLOCKSIZE = 102400

Public Property Let DbName(ByVal strVal As String)

mstrDbName = strVal

End Property

Public Property Let TableName(ByVal strVal As String)

mstrTableName = strVal

End Property

Public Property Let NameOfImageColumn(ByVal strVal As String)

mstrImageColumnName = strVal

End Property

Public Property Let NameOfImageTypeColumn(ByVal strVal As String)

mstrImageTypeColumnName = strVal

End Property

Public Property Let NameOfImageIdColumn(ByVal strVal As String)

mstrImageIdColumnName = strVal

End Property

Public Property Get ImageFile(ByVal ImageId As Integer) As String

Dim intPos As Integer

Dim blnFindId As Boolean

Dim i As Integer

blnFindId = False

For i = 0 To mlngNumberOfFiles - 1

If mlngImageId(i) = ImageId Then

intPos = 5 + Len(ImageId) + 3

ImageFile = Right(mstrFileName(i), intPos) 'reformat the location of file.

blnFindId = True

End If

Next i

If blnFindId = False Then

Err.Clear

Err.Raise vbObjectError + 23, "Get ImageFile", "Can't find image file!"

End If

End Property

Public Sub OpenConnection()

'**********************************************************

'作用:打开数据库连接。

'**********************************************************

On Error GoTo Error_handler

If mstrDbName = "" Then GoTo Error_handler

If mAdoConn.State = adStateOpen Then mAdoConn.Close

mAdoConn.ConnectionString = "DRIVER={SQL Server};SERVER=(local);UID=sa;PWD=;WSID=JIA;DATABASE=" & mstrDbName

mAdoConn.ConnectionTimeout = 15

mAdoConn.Open

Exit Sub

Error_handler:

Call HandleError

End Sub

Public Sub CreateTempImageFile(ByVal ImageId As Integer)

Dim strImageType As String

Dim i As Integer

'**********************************************************

'作用:打开记录集,提取二进制数据,并把数据存入文件。注意文件名使用图片ID生成。

'输入:图片ID。

'**********************************************************

If mAdoConn.State = adStateClosed Then Exit Sub

Call OpenRecordset(ImageId)

If mAdoRst.State = adStateClosed Then Exit Sub

On Error GoTo Error_handler

For i = 0 To mlngNumberOfFiles - 1

'检测图片文件是否已经存在。

If mlngImageId(i) = ImageId Then Exit Sub

Next i

mlngNumberOfFiles = mlngNumberOfFiles + 1

ReDim Preserve mstrFileName(mlngNumberOfFiles) '改变数组大小。

ReDim Preserve mlngImageId(mlngNumberOfFiles) '改变数组大小。

mlngImageId(mlngNumberOfFiles - 1) = ImageId

strImageType = mAdoRst.Fields(mstrImageTypeColumnName) ' 取得图片类型。

mstrFileName(mlngNumberOfFiles - 1) = App.Path & "\images" & _

"\image" & LTrim(Str(ImageId)) & "." & strImageType'取得图片文件名称和位置。

Call ReadFromDB(mAdoRst.Fields(mstrImageColumnName), _

mstrFileName(mlngNumberOfFiles - 1), AdoRst.Fields(mstrImageColumnName).ActualSize)

Exit Sub

Error_handler:

Call HandleError

End Sub

Private Sub OpenRecordset(ByVal ImageId As Integer)

Dim SqlText As String

'**********************************************************

'作用:打开记录集。

'输入:图片ID。

'**********************************************************

On Error GoTo Error_handler

If mAdoRst.State = adStateOpen Then mAdoRst.Close

SqlText = "SELECT " & mstrImageColumnName & "," & _

mstrImageTypeColumnName & " FROM " & mstrTableName & _

" WHERE " & mstrImageIdColumnName & "=" & ImageId

Set mAdoRst.ActiveConnection = mAdoConn

mAdoRst.Open SqlText, , adOpenStatic, adLockReadOnly 'Open recordset.

Exit Sub

Error_handler:

Call HandleError

End Sub

Private Sub ReadFromDB(fld As ADODB.Field, ByVal DiskFile As String, _

FldSize As Long)

Dim NumBlocks As Integer

Dim LeftOver As Long

Dim byteData() As Byte '字节数组,用于长的可变二进制数据L

[1] [2] 下一页

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有