将图片插入数据库并使用asp.net读取出来的正确方法
 书写本文是因为今天见到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(re