技术开发 频道

用ASP.NET2.0在数据库中存储二进制文件(二)


【IT168技术文档】

  五、上传图像并使用ASP.NET 2.0数据源控件代码存储二进制数据

  尽管ADO.NET方法工作在一个 ASP.NET 2.0应用程序环境下,但是,你还能够使用ASP.NET 2.0的数据源控件来把二进制数据存储到一个数据库,这不要求你编写ADO.NET代码。在这个演示程序中所使用的SqlDataSource控件包含了一个InsertCommand,以及相应于Title,MIMEType和ImageData值的参数:

<asp:SqlDataSource ID="UploadPictureDataSource" runat="server" ConnectionString="..." InsertCommand="INSERT INTO [Pictures] ([Title], [MIMEType], [ImageData]) VALUES (@Title, @MIMEType, @ImageData)"> <InsertParameters> <asp:Parameter Name="Title" Type="String" /> <asp:Parameter Name="MIMEType" Type="String" /> <asp:Parameter Name="ImageData" /> </InsertParameters> </asp:SqlDataSource>
  注意,在此,ImageData参数并没有指定一个类型。如果你试图使用GUI向导来构建 SqlDataSource的语法,那么,它将可能给它指定Type="Object",然而,这个Type="Object"将会产生一个sql_variant类型的参数。然而,该 sql_variants类型不能用来存储图像或varbinary(MAX)数据类型,因为该sql_variant的内在数据大小不能超过8,000 个字节。(如果你试图使用Type="Object",然后试图保存超过8,000字节大小的二进制数据,那么,系统将抛出一个异常并显示消息 "Parameter '@ImageData' exceeds the size limit for the sql_variant datatype";如果你试图添加不到8,000字节大小的二进制数据,那么,该异常将显示消息"Implicit conversion from data type sql_variant to varbinary(max) is not allowed")。

  另外, DetailsView控件包含了两个TemplateField。其中,一个TemplateField中使用一个TextBox控件来显示标题栏;另一个使用一个FileUpload控件来表示ImageData栏。最终结果是得到一个看上去类似于在"上传图像并使用ADO.NET代码存储二进制数据 "一节中的用户接口。当点击DetailsView的"Insert"按钮时,它的Inserting事件激发,这时二进制数据必须从 FileUpload控件中获取,读到一个字节数组中,并且赋值给适当的参数:
Protected Sub UploadPictureUI_ItemInserting(ByVal sender As ObjectByVal e As System.Web.UI.WebControls.DetailsViewInsertEventArgs) Handles UploadPictureUI.ItemInserting  '引用FileUpload控件  Dim UploadedFile As FileUpload = CType(UploadPictureUI.FindControl("UploadedFile"), FileUpload)  '确保已经成功上传一个文件  If UploadedFile.PostedFile Is Nothing OrElse String.IsNullOrEmpty(UploadedFile.PostedFile.FileName) OrElse UploadedFile.PostedFile.InputStream Is Nothing Then   ...显示错误信息...   e.Cancel = True  Exit Sub End If '确保我们在处理一个JPG或GIF文件 Dim extension As String = Path.GetExtension(UploadedFile.PostedFile.FileName).ToLower() Dim MIMEType As String = Nothing Select Case extension  Case ".gif"   MIMEType = "image/gif"  Case ".jpg"".jpeg"".jpe"   MIMEType = "image/jpeg"  Case ".png"   MIMEType = "image/png"  Case Else   '无效文件类型上载   ... 显示错误信息...   e.Cancel = True   Exit Sub End Select "指定MIMEType和ImageData参数的值 e.Values("MIMEType") = MIMEType '把FileUpload的InputStream加载进字节数组中 Dim imageBytes(UploadedFile.PostedFile.InputStream.Length) As Byte UploadedFile.PostedFile.InputStream.Read(imageBytes, 0, imageBytes.Length)  e.Values("ImageData") = imageBytes End Sub
0
相关文章