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数据库中。
代码我就不贴了,那里面挺详细的。
有几个比较重要的点:
- Enctype 属性指定将数据回发到服务器时浏览器使用的编码类型。multipart/form-data:窗体数据被编码为一条消息,页上的每个控件对应消息中的一个部分。
- 数据库里的图片对应字段的属性要设置成image。
- 图片读取的时候,因为数据库里存放的是二进制数据,所以要用BinaryWrite方法将从数据库中读取的二进制数据写入页面
- 为了使用性,还是要建立一个image控件,对页面文件进行关联。