网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > ASP.NET技巧
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
本月文章推荐
.获得connect string简单方法.
.asp.net调用存储过程方法新解.
.将输入的20041219等的数字字符串.
.ASP.NET2.0中的ClientScriptMana.
.发布一个自己写的PrintPreviewCo.
.FCKeditor 2.3 在ASP.NET中文件上.
.在IIS与.net框架中配置中把扩展名.
.关于Leon.Zhou“ASP.NET 2.0 正式.
.ASP.NET控件开发之"代码紧凑原则".
.将Web站点下的绝对路径转换为虚拟.
.ASP.NET 1.1 没有出现在 IIS 6.0.
.net2.0如何修改用户密码的解决.
.安装Asp.net 2.0服务器出现Serve.
.ASP.NET中在线用户统计的简单实现.
.翻译 一些很酷的.Net技巧.
.学习一下.net framework 中有关安.
.GridViewRow可以任意位置单击引发.
.如何制作winform得启动画面.
.ASP.NET的错误处理机制.
.字符自动截取问题.

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

发表日期:2007-8-26


  五、上传图像并使用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 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.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

上一篇:用asp.net2.0在数据库中存储二进制文件(一) 人气:4487
下一篇:解决asp.net安装后无法访问oracle数据库问题 人气:5189
浏览全部asp.net 2.0的内容 Dreamweaver插件下载 网页广告代码 祝你圣诞节快乐 2009年新年快乐