最近做一个项目的时候需要往数据库内插入图片,上网查了一下,主要有两种方法,第一就是在数据库中存储图片的路径,然后在程序中根据读取的路径读取图片;这种方法简单、容易使用,但是在图片过多时不好管理。第二种就是将图片转换成二进制存储于数据库中,sql server 2005有个image数据类型,专门用于存储图片,Image数据类型存储的是长度不确定的二进制数据,最大长度是2GB。第一种方法很简单,主要想通过一个例子说一下第二种方法。步骤如下:1.开发环境:visual studio 2008 + sql server 2005 语言:C#2.在sql server 2005中新建一个数据库表,我这里用的是我自己项目的表,语法如下。
1 2 3 4 5 6 7 |
CREATE TABLE [dbo].[AdminInfo]( [AdminId] [nvarchar](15) NOT NULL, [AdminName] [nchar](10) NOT NULL, [Pas] [nvarchar](25) NOT NULL, [Rights] [int] NOT NULL, [Photo] [image] NULL ) |
注意photo字段是image类型。
3.这里主要通过一个简单控制台应用程序演示插入和读取图片的过程。完整代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 |
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; using System.Data.SqlClient; using System.Data; namespace CSharp { class insertImage { public string sqlconnstr = "Data Source=XIANGZI-PC//SQLEXPRESS;Initial Catalog=Library;Persist Security Info=True;User ID=xz;Password=comeon";//数据库连接字符串; public void InsertIMG()//插入图片 { FileStream fs = new FileStream(@"D:/c.jpg", FileMode.Open, FileAccess.Read);//读取D盘c.jpg转换为数据流 Byte[] btye2 = new byte[fs.Length]; fs.Read(btye2, 0, Convert.ToInt32(fs.Length)); fs.Close(); using (SqlConnection conn = new SqlConnection(sqlconnstr)) { conn.Open(); SqlCommand cmd = new SqlCommand(); cmd.Connection = conn; cmd.CommandText = "insert into AdminInfo(AdminId,AdminName,Pas,Rights,Photo) values('101','000','1234','1',@Photo)";//插入数据库 SqlParameter par = new SqlParameter("@Photo", SqlDbType.Image); par.Value = btye2; cmd.Parameters.Add(par); int t = (int)(cmd.ExecuteNonQuery()); if (t > 0) { Console.WriteLine("插入成功!"); } conn.Close(); } } public void ReadImage()//读取图片 { byte[] MyData = new byte[0]; using (SqlConnection conn = new SqlConnection(sqlconnstr)) { conn.Open(); SqlCommand cmd = new SqlCommand(); cmd.Connection = conn; cmd.CommandText = "select Photo from AdminInfo where AdminId='101'"; SqlDataReader sdr = cmd.ExecuteReader(); sdr.Read(); MyData = (byte[])sdr["Photo"];//读取第一个图片的位流 int ArraySize = MyData.GetUpperBound(0);//获得数据库中存储的位流数组的维度上限,用作读取流的上限 FileStream fs = new FileStream(@"D:/d.jpg", FileMode.OpenOrCreate, FileAccess.Write);//读取图片并将其存储为D盘d.jpg fs.Write(MyData, 0, ArraySize); fs.Close(); conn.Close(); Console.WriteLine("读取成功!"); } } public static void Main(String[] args) { insertImage test = new insertImage(); test.InsertIMG();//插入图片 test.ReadImage();//读取图片 } } } |
4.执行此程序,便可以在D盘下看到d.jpg.此外数据库中Photo字段会显示为“<二进制数据>”;
1 |
<span style="font-family: microsoft yahei;"><img src="http://hi.csdn.net/attachment/201004/10/0_1270859474B8pa.gif" alt="" /></span> |