中国站长下载-为中国站长提供最好最全的建站资源! 首 页发布资源有事留言繁體中文
设为首页
加入收藏
联系我们
 
您当前的位置:中国站长下载 -> 文章中心 -> 网页编程 -> .NET编程 -> 文章内容  虚拟主机 域名注册 退出登录 用户管理
栏目导航
· ASP编程 · .NET编程
· PHP编程 · JSP编程
· CGI 专区
热门文章
· sndvol32 - sndvol3...
· [组图] FLASH:《大话李白》...
· 个人网站到底能赚多...
· [图文] Rundll.exe是病毒吗...
· [组图] Flash:制作MV
· 价值12万元的网站SE...
· 网站创业者,你需要...
· 一个成功的网站设计...
· [图文] FLASH:韩国导航条解...
· 中国网站的赚钱模式...
相关文章
· 将图片插入数据库并...
· Linux下安PHP,APACH...
将图片插入数据库并使用asp.net读取出来的正确方法(1)
作者:不详  来源:不详  发布时间:2006-8-14 8:36:51  发布人:chinazhan

 减小字体 增大字体

     书写本文是因为今天见到CSDN的首页上一篇存在明显失误的名为“在Asp.Net中从sqlserver检索(retrieve)图片”的文章。不说其错误是因为用其方法确实能从数据库中读取出图片并显示在浏览器,说其失误是因为代码的意图不能被完全的实现,作者也似乎对http协议以及浏览器在处理http数据的流程一知半解。
  
  
  
  1、如何出错
  
  以下是这片文章提到的方法:
  
  Public Sub Page_Load(sender As Object, e As EventArgs)
  Dim myConnection As New SqlConnection(ConfigurationSettings.AppSettings("ConnectionString"))
  Dim myCommand As New SqlCommand("Select * from Person", myConnection)
  Try
  myConnection.Open()
  Dim myDataReader as SqlDataReader
  myDataReader = myCommand.ExecuteReader(CommandBehavior.CloseConnection)
  
  Do While (myDataReader.Read())
  Response.ContentType = myDataReader.Item("PersonImageType")
  Response.BinaryWrite(myDataReader.Item("PersonImage"))
  Loop
  
  myConnection.Close()
  Response.Write("Person info successfully retrieved!")
  Catch SQLexc As SqlException
  Response.Write("Read Failed : " & SQLexc.ToString())
  End Try
  End Sub
  
  显然,编程者是想将Person表中所有的记录中的PersonImage字段所存储的图片一次性地输出到浏览器中,并且在输出成功地情况下在已输出的图片的下方打印出“Person info successfully retrieved!”信息。然而事实上上述代码仅仅能正确地输出第一条记录中的图片。对于浏览器来说,一个http请求获取一个文件(html或者图片),所以以上代码的输出将被作为一个文件(类型依据Response.ContentType = myDataReader.Item("PersonImageType")定)被浏览器处理。如果http相应的类型是image/jpeg之类的图片,则浏览器使用相应的图片解析功能对这一个图片文件进行解析。因此,上述代码的显示结果只能是第一条记录PersonImage字段的图片。后面的记录输出的图片数据将成为第一张图片的多余数据(此点具有普遍性,但并非绝对,依图片的格式而定),从而后面的“Person info successfully retrieved!”的信息也自然无法本显示出来,因为这些信息已经是图片文件里面的编码了。
  
  
  
  2、正确的做法
  
  A、将图片输入到数据库中,以下是一个将图片输入到数据库的代码片断:(完整的DEMO程序见附录一)
  
  FileStream fs=File.OpenRead(filePath.Text);
  
  byte[] content=new byte[fs.Length];
  
  fs.Read(content, 0,content.Length);
  
  fs.Close();
  
  
  
  SqlConnection conn=new SqlConnection("Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=DatabaseImage;Data Source=(local)");
  
  conn.Open();
  
  
  
  SqlCommand comm=conn.CreateCommand();
  
  comm.CommandText="insert into Images(Image, contentType) values(@image, @contentType)";
  
  comm.CommandType=CommandType.Text;
  
  
  
  comm.Parameters.Add("@image", SqlDbType.Image).Value=content;
  
  comm.Parameters.Add("@contentType", SqlDbType.NVarChar).Value=
  
  GetContentType(new FileInfo(filePath.Text).Extension.Remove(0,1));
  
  
  
  if(comm.ExecuteNonQuery()==1)
  
  {
  
  MessageBox.Show("Successfully insert image into database!");
  
  }
  
  else
  
  {
  
  MessageBox.Show("Failed to insert image into database");
  
  }
  
  
  
  conn.Close();
  
  
  
  B、将数据库中的图片读出来的代码片断:(完整DEMO程序见附录二)
  
  try{
  
  SqlConnection conn=new SqlConnection("Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=DatabaseImage;Data Source=(local)");
  
  conn.Open();
  
  
  
  SqlCommand comm=conn.CreateCommand();
  
  comm.CommandText="select * from Images where id=@id";
  
  comm.CommandType=CommandType.Text;
  
  
  
  comm.Parameters.Add("@id", SqlDbType.BigInt).Value=int.Parse(Request["id"]);
  
  
  
  SqlDataReader reader=comm.ExecuteReader();
  
  while(reader.Read())
  
  {
  
  Response.ContentType=reader["contentType"].ToString();
  
  Response.BinaryWrite((byte[])reader["Image"]);
  
  }
  
  Response.End();
  
  
  
  conn.Close();
  
  }
  
  catch
  
  {
  
  Response.End();
  
  }
  
  这段代码可置于Page_Load事件中,数据图片要注意的两点是:
  
  一、 设置正确的ContentType(http中的content-type),图片的content-type格式一般为image/*,如jpeg为image/jpeg,bmp为image/bmp等等。
  
  二、 仅仅输出一张图片二进制流,asp.net 中Page_Load事件先于页面输出被触发,因此图片的输出可以在此事件中进行,直接操作Reponse对象,避免输出与图片无关的而外信息(额外的第二张图片或者文字)。图片的二进制流输出后及时使用Response.End()方法结束http响应,避免页面中的额外信息被asp.net的引擎默认输出到客户端。
  
  
  
  希望此文能够起到抛砖引玉的作用!^_^
  
    做人要厚道,请注明转自chinazhan中国站长(www.ChinaZhan.com)。

 
[] [返回上一页] [打 印] [收 藏]
∷相关文章评论∷    (评论内容只代表网友观点,与本站立场无关!) [更多评论...]
中国站长下载
中国站长下载

本页只接受PR>=4 IT类站点连接,申请连接,谢谢您们的支持!希望我们的下载站能够真正帮到中国的站长们!
关于本站 - 网站帮助 - 广告合作 - 下载声明 - 友情连接 - 网站地图
Copyright © 2005-2006 ChinaZhan.Net. All Rights Reserved .