用SQL Server为Web浏览器提供图像 - 1

微软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_id  int  CONSTRAINT pk_prod PRIMARY KEY NONCLUSTERED IDENTITY(1, 1),
        categ_id  int  NULL  CONSTRAINT fk_prod REFERENCES categories(categ_id),
        prod_name  char(80) NOT NULL UNIQUE   NONCLUSTERED,
        prod_unitprice  money  NOT NULL,
        prod_unitquant  char(15)  NOT NULL,
        prod_desc  varchar(255) NULL   DEFAULT ('unknown'),
        prod_imagetype  char(3)  NOT NULL,
        prod_image image  NOT NULL,)
    GO