用ASP.NET2.0在数据库中存储二进制文件
2007-11-06 15:11
417 查看
五、上传图像并使用ASP.NET 2.0数据源控件代码存储二进制数据
尽管ADO.NET方法
工作在一个ASP.NET 2.0应用程序环境下,但是,你还能够使用ASP.NET
2.0的数据源控件来把二进制数据存储到一个数据库,这不要求你编写ADO.NET代码。在这个演示程序中所使用的SqlDataSource控件包含了
一个InsertCommand,以及相应于Title,MIMEType和ImageData值的参数:
注意,在此,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控件中获取,读到一个字节数组中,并且赋值给适当的参数:
就象前面的"Insert"按钮的Click事件处理器一样,该DetailsView的Inserting事件处理器也执行相同的逻辑-只有一些小小
的语法差别。首先,既然FileUpload控件位于一个模板内,所以,必须使用FindControl("controlID")方法以编程方式来引用
它。一旦对它进行了引用,即对之进行相同的检查以确保一个文件被成功上传,并且允许相应的扩展名。对于DetailsView的Inserting事件处
理器存在一个微小的区别是,如果出现了错误,那么,我们需要通知该DetailsView停止相应的插入工作-这是通过把e.Cancel属性设置为
True实现的。
检查完之后,MIMEType和ImageData参数将被使用e.Values("parameterName")=value语法进行赋值。就象在前面的ADO.NET示例中一样,首先把该二进制数据读取到一个字节数组中,然后把该字节数组赋值给该参数。本文出自 “青峰” 博客,转载请与作者联系!
尽管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 Object, ByVal 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 |
就象前面的"Insert"按钮的Click事件处理器一样,该DetailsView的Inserting事件处理器也执行相同的逻辑-只有一些小小
的语法差别。首先,既然FileUpload控件位于一个模板内,所以,必须使用FindControl("controlID")方法以编程方式来引用
它。一旦对它进行了引用,即对之进行相同的检查以确保一个文件被成功上传,并且允许相应的扩展名。对于DetailsView的Inserting事件处
理器存在一个微小的区别是,如果出现了错误,那么,我们需要通知该DetailsView停止相应的插入工作-这是通过把e.Cancel属性设置为
True实现的。
检查完之后,MIMEType和ImageData参数将被使用e.Values("parameterName")=value语法进行赋值。就象在前面的ADO.NET示例中一样,首先把该二进制数据读取到一个字节数组中,然后把该字节数组赋值给该参数。本文出自 “青峰” 博客,转载请与作者联系!
相关文章推荐
- 用ASP.NET2.0在数据库中存储二进制文件
- 图片、文件、二进制文件 三种资源不要放进数据库存储
- 上传文件以二进制存储到数据库中
- ASP.NET2.0中将数据库字段中存储的文件显示出来
- 周六周天加班,终于完成了将任何文件转换为二进制存储到数据库的工作
- 上传文件以二进制存储到数据库中
- Oracle数据库对于大对象二进制文件的存储及下载
- asp.net 把word转化成二进制文件存储到数据库
- 在数据库中 存储图片 以及 在界面中显示图片(存储图片路径)- 这种方法相对与存储二进制文件好
- 数据库尽量不要存储较大的二进制数据,如图片、视频、文件等
- 将文件转化为二进制(以便存储到数据库)
- 将图片(二进制文件)存储于数据库,论文件字节流与二进制字符串相互转换
- C#中将图片文件转化为二进制数组-用于数据库存储
- 数据库存储文字文件和二进制文件
- c#将文件以二进制形式存入数据库
- BinaryImage:直接显示以二进制形式存储在数据库中的图片
- 分布式文件存储的数据库开源项目MongoDB
- 关于图片或者文件在数据库的存储方式归纳
- 访问外部存储中的数据库文件,使用CursorAdapter显示在ListView组件上
- 数据库中存储与读取文件