就象前面的"Insert"按钮的Click事件处理器一样,该DetailsView的Inserting事件处理器也执行相同的逻辑-只有一些小小的语法差别。首先,既然FileUpload控件位于一个模板内,所以,必须使用FindControl("controlID")方法以编程方式来引用它。一旦对它进行了引用,即对之进行相同的检查以确保一个文件被成功上传,并且允许相应的扩展名。对于DetailsView的Inserting事件处理器存在一个微小的区别是,如果出现了错误,那么,我们需要通知该DetailsView停止相应的插入工作-这是通过把e.Cancel属性设置为True实现的。
检查完之后,MIMEType和ImageData参数将被使用e.Values("parameterName")=value语法进行赋值。就象在前面的ADO.NET示例中一样,首先把该二进制数据读取到一个字节数组中,然后把该字节数组赋值给该参数。
六、 显示二进制内容 无论你使用什么技术把数据存储在数据库中,为了检索并显示二进制数据,我们需要创建一个新的ASP.NET页面。这个名字为ShowPicture.aspx的页面,将通过querystring把一个PictureID传递给它,并且从指定的产品的ImageData域中返回该二进制数据。一旦完成,通过访问/ShowPicture.aspx?PictureID=picutreID地址即可看到一个特定的图片。因此,为了把一个图像显示在一个web页面上,我们可以使用一个图像控件并把它的ImageUrl属性设置成适当的URL。
注意,这个ShowPicture.aspx在其.aspx页面中并没有包括任何HTML标记。在code-behind类的Page_Load事件处理器中,将使用ADO.NET代码从数据库中检索指定的Pictures行的MIMEType和ImageData。然后,该页面的ContentType被设置为MIMEType域的值,并且使用Response.BinaryWrite(ImageData)输出该二进制数据:
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load Dim PictureID As Integer = Convert.ToInt32(Request.QueryString("PictureID")) ''与数据库连接并且返回指定的图片的图像内容和MIME类型 Using myConnection As New SqlConnection(ConfigurationManager.ConnectionStrings( "ImageGalleryConnectionString").ConnectionString) Const SQL As String = "SELECT [MIMEType], [ImageData] FROM [Pictures] WHERE [PictureID] = @PictureID" Dim myCommand As New SqlCommand(SQL, myConnection) myCommand.Parameters.AddWithValue( "@PictureID", PictureID) myConnection.Open() Dim myReader As SqlDataReader = myCommand.ExecuteReader If myReader.Read Then Response.ContentType = myReader( "MIMEType").ToString() Response.BinaryWrite(myReader( "ImageData")) End If myReader.Close() myConnection.Close() End Using End Sub |
当ShowPicture.aspx页面完成后,你就可以通过直接访问URL或通过一个图像web控件(或经由静态<img src="ShowPicture.aspx?ProductID=productID" />标记)来观看图像。下面的第一幅屏幕快照展示了当直接通过ShowPicture.aspx观察时的一个图像;第二个屏幕快照展示了该图像画廊的Default.aspx页面-程序中在一个FormView控件内使用了一个Image Web控件,从而允许用户按页面浏览画廊中的图像。
七、 结论 当构建数据驱动的应用程序(其中必须捕获二进制数据)时