接下来,让我们讨论本文重点—如何在ASP页面中输出直接存储在数据库中的图像数据。
三、 事件设计
示例工程中的DispImage.aspx页面在其初始化函数Page_Load(object sender,EventArgs e)中使用Response对象输出一幅图像—该图像存储在SQL Server 2005 Express Edition数据库中,并用二进制表示。
在代码中,我们首先从数据库PictureDB的表格PictureTab中获取一个ID值为1的图片,然后使用byte数组Data保存图片的数据。然后,我们可以基于如下步骤来输出相应的图像:
1. 设置Response对象的输出类型;
2. 输出图像的文件头;
3. 输出图像的二进制数据;
4. 结束输出。如果图片太大,还可以使用输出缓冲的方法。
函数Page_Load(object sender,EventArgs e)的程序代码如下:
1protected void Page_Load(object sender,EventArgs e)
2{ /**////创建链接
3SqlConnection myConnection = new SqlConnection(
4ConfigurationManager.ConnectionStrings["SQLCONNECTIONSTRING"].ConnectionString);
5/**////定义SQL语句
6string cmdText = "SELECT * FROM PictureTab WHERE PictureID=''1''";
7/**////创建Command
8SqlCommand myCommand = new SqlCommand(cmdText,myConnection);
9/**////定义DataReader
10SqlDataReader dr = null;
11try
12{ /**////打开链接
13myConnection.Open();
14/**////读取数据
15dr = myCommand.ExecuteReader(CommandBehavior.CloseConnection);
16}
17catch(SqlException ex)
18{ /**////抛出异常
19throw new Exception(ex.Message,ex);
20}
21/**////定义保存数据的字节数组
22byte Data = null;
23while(dr.Read())
24{ /**////读取数据
25Data = (byte)dr["Data"];
26Response.ContentType = dr["Type"].ToString();
27}
28dr.Close();
29//显示图片数据
30this.EnableViewState = false;
31/**////输出文件头
32Response.AppendHeader("Content-Length",Data.Length.ToString());
33/**////输出文件的数据
34Response.BinaryWrite(Data);
35/**////结束输出
36Response.End();
37}
四、 附注与小结
把上面的页面DispImage.aspx设置为初始页面,然后运行上面的示例工程。此时,页面上应该显示一张存储在数据库表格中的图片。
在实践中,有些情况下需要把图像数据直接存储在数据库中;而有些情况下只在数据库存储图像文件的URL而把实际图像文件存储在服务器文件系统中则更好。从性能上看,将这种大型数据存储为文件肯定要快一些,而且图形人员能够更为容易地访问图像并对其编辑。然而,当需要在不同机器间移动数据库时,将这种大型数据存储为文件就会面临最棘手的问题,因为文件很容易断开与数据库的连接。因此,如果将其直接存储在数据库中则明显可以使数据保持轻松的同步。总之,各有利弊,需慎重做出选择。