代码改变世界

SQLSERVER与图片存储读取的那点事

2010-04-22 11:16  huayifu  阅读(1490)  评论(4)    收藏  举报

      一提到sql server中图片的存储,我首先想到的是:在服务器创建一个地址专门放图片,数据库里只要存储地址就可以了,读取亦然。然而后来发现sql server中有个字段属性是image(不由得想起之前突然发现里面有个xml属性,然后就有了别有洞天的发现,关于xml,将在后面的文章中探讨一下。),于是想到会不会数据库能直接存储图片的?于是Google了一把,铺天盖地的都是(我落后了。--#)。现在亲自动手实践一下,看一看sql server对图片到底是怎么操作的。

      首先测试环境是VS2008 + sql server 2005。

      现在主要讨论两个方式:

  • 以地址方式进行存储
  • 以二进制方式进行存储  

1)以地址方式存储

      这是比较通用的做法,而且也比较容易维护。

 前台设计

代码
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default3.aspx.cs" Inherits="Default3" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>無題のページ</title>
</head>
<body>
<form id="form1" runat="server">
<div style="height: 349px">

<asp:Button ID="btn_Save" runat="server" Text="Save"
onclick
="btn_Save_Click" />

<br />
<asp:Label ID="Label1" runat="server" Text=""></asp:Label>

<br />
<asp:Button ID="btn_Output" runat="server" Text="Output"
onclick
="btn_Output_Click" />
<br />
<asp:Image ID="Image1" runat="server" />

</div>
</form>
</body>
</html>

 后台

 

代码
using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Data.SqlClient;

public partial class Default3 : System.Web.UI.Page
{
//数据库连接
string strConn = @"server=libin;database=li_test;user id=sa;password=1234";
protected void Page_Load(object sender, EventArgs e)
{
//一开始要隐藏图片,不然会有叉子。。。
Image1.Visible = false;
}
protected void btn_Save_Click(object sender, EventArgs e)
{
SqlConnection conn
= new SqlConnection(strConn);
SqlCommand cmd
= conn.CreateCommand();

//这里用的是最简单的数据库设计,即img_test1(img varchar(100))
string sql = "insert into img_test1(img) values(@img)";
cmd.CommandText
= sql;
//参数
cmd.Parameters.Add("@img", SqlDbType.VarChar, 100);
//如果是在服务器上,则用相对路径,如果是自己没事做着玩,可以用绝对路径,至于为什么,Google一下。
cmd.Parameters["@img"].Value = @"~/image/baidu.jpg";
try
{
conn.Open();
cmd.ExecuteNonQuery();
conn.Close();
Label1.Text
= "OK!";
}
catch (Exception ex)
{
Response.Write(
"the img save is error:" + ex.ToString());
}
}
protected void btn_Output_Click(object sender, EventArgs e)
{
SqlConnection conn
= new SqlConnection(strConn);
SqlCommand cmd
= conn.CreateCommand();

//这里用的是最简单的数据库设计,即img_test1(img varchar(100))
string sql = "select img from img_test1";
cmd.CommandText
= sql;

try
{
conn.Open();
SqlDataReader myReader
= cmd.ExecuteReader();
while (myReader.Read())
{
Image1.ImageUrl
= Convert.ToString(myReader["img"]);
Image1.Visible
= true;
}
conn.Close();

}
catch (Exception ex)
{
Response.Write(
"the img output is error:" + ex.ToString());
}
}
}

因为代码比较简单,里面也有注释,这里就不作什么解释了。

2)以二进制方式进行存储

     这种方式主要是以数据流来进行操作的。有一篇文章写的不错:在ASP.NET中将图片存储到Sql Server数据库中

代码我就不贴了,那里面挺详细的。

有几个比较重要的点:

  1. Enctype 属性指定将数据回发到服务器时浏览器使用的编码类型。multipart/form-data:窗体数据被编码为一条消息,页上的每个控件对应消息中的一个部分。
  2. 数据库里的图片对应字段的属性要设置成image。
  3. 图片读取的时候,因为数据库里存放的是二进制数据,所以要用BinaryWrite方法将从数据库中读取的二进制数据写入页面
  4. 为了使用性,还是要建立一个image控件,对页面文件进行关联。