SQL Server 2005 Image数据类型的使用

来源:互联网 发布:ibm软件培训 编辑:程序博客网 时间:2024/05/29 19:22

       最近做一个项目的时候需要往数据库内插入图片,上网查了一下,主要有两种方法,第一就是在数据库中存储图片的路径,然后在程序中根据读取的路径读取图片;这种方法简单、容易使用,但是在图片过多时不好管理。
      第二种就是将图片转换成二进制存储于数据库中,sql server 2005有个image数据类型,专门用于存储图片,Image数据类型存储的是长度不确定的二进制数据,最大长度是2GB。
      第一种方法很简单,主要想通过一个例子说一下第二种方法。步骤如下:
1.开发环境:visual studio 2008 + sql server 2005 语言:C#
2.在sql server 2005中新建一个数据库表,我这里用的是我自己项目的表,语法如下。
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.这里主要通过一个简单控制台应用程序演示插入和读取图片的过程。完整代码如下:
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字段会显示为“<二进制数据>”;