收藏本站
网站导航
联系方式
网站首页 | 杂志简介 | 论文欣赏 | 在线订阅 | 征稿启事 | 投稿须知 | 资讯速递 | 写作指南
本刊信息

主管:广西国有资产监督管理委员会
主办:广西轻工业科学技术研究院
协办:广西轻工协会
      广西酿酒协会
编辑/出版:《广西轻工业》编辑部
编委会主任:罗左青
编委会副主任:程劲芝 梁智
编委:白树雄 宋  苹 蒋敬全
      谢晓航 雷光鸿 贤章胜
主编:贤章胜
地址:广西南宁经济技术开发区
      迎凯路8号
邮编:530031
编辑部:0771-4518435
        4518909转8968
投稿信箱:qgkj@vip.126.com
网址:www.qgkjlw.com
国际标准刊号:ISSN2095—3518
国内统一刊号:CN45—1385/TS
订阅:全国各地邮局
邮发代号: 48—123
定价:人民币15元
刊期:月刊

理事单位

广西粮油科学研究所
广西大学轻工与食品工程学院
广西大学生命科学与技术学院
广西农垦糖业集团金光制糖有限公司
广西农垦糖业集团昌菱制糖有限公司
广西机械工业研究院
重庆啤酒集团柳州啤酒有限责任公司
南宁吉然节能环保技术有限公司
柳州柳连机械制造有限责任公司
南京润维热工设备有限公司
广西柳州市嘉诚汽车饰件系统有限公司
广西柳江县柳兴榨辊有限责任公司
广西南宁丰烁电力设备节能有限公司
广西都安密洛陀野生葡萄酒有限公司
广西巴马神酒业有限责任公司
广西中天领御酒业有限公司
广西北海市合浦东园家酒厂
桂林理工大学管理学院
广西工业职业技术学院   
广西农业职业技术学院
广西二轻工业技工学校
广西德保县酒厂
广西全州湘山酒厂
田阳南华纸业有限公司
广西桂平乳泉液酒业有限公司

 
首页>> 论文欣赏 >> 计算机科学与信息技术>> 正 文
 

SQL SERVER 2008中使用VARBINARY(MAX)进行图像存取的实现方法

2010年第3期(总第136期)
韦善周1,2,蓝雪燕2(1.广西师范大学计算机科学与信息工程学院,广西 桂林541004;2.广西机电职业技术学院,广西 南宁530007)
 
  【摘 要】 探讨SQL SERVER 2008中如何使用VARBINARY(MAX)数据类型存储和读取显示图像数据,并结合源代码对实现的方法及关键技术进行阐述。
  【关键词】 SQL Server;数据库;图像存取
 
  在数据库应用项目开发中,经常会使用一些二进制的图像数据,存储和读取显示图像数据主要采用的是路径链接法和内存流法。路径链接法是将图像文件保存在固定的路径下,数据库中只存储图像文件的路径和名称,此方法数据库容量小,存取速度快,但安全性较差;内存流法是将二进制数据直接存储在数据库中,此方法对数据的共享非常方便,安全性相对较高,常用于图像容量不是很大的时候。
  本文主要讨论通过SQL Server 2008使用内存流法如何实现二进制图像数据的存储。
 
1 VARBINARY(MAX)数据类型简介
  在SQL Server 2000和更早的版本中,如果每条记录的数据量远远超过了一个单独记录的8K,我们常用IMAGE数据类型以二进制存储该数据,在使用IMAGE数据类型时,数据是不和普通数据存储在一起的。一个被称作指针的很小的二进制值,和普通数据存储在一起,这个二进制值指向数据文件里的数据实际存储的位置。对IMAGE数据进行读取、插入数据时需要使用READTEXT[1]及WRITETEXT命令,这两个命令需使用TEXTPTR函数来获得正确的二进制指针,这个二进制指针用于定位物理文件中的数据,使用起来较麻烦。
  虽然在SQL Server 2008中依然提供IMAGE数据类型,但微软计划在未来的SQL Server版本中删除IMAGE数据类型, 用VARBINARY(MAX)数据类型来代替,在该版本下不应当使用IMAGE这种类型。
  VARBINARY(MAX) 为可变长度二进制数据,不限最大长度,常用于数据超出 8,000 字节时,可以直接使用insert命令添加数据,使用起来较简单。
 
2 使用T-SQL语句将图像文件直接读入VARBINARY(MAX)字段
  首先在SQL Server 2008的查询窗口中创建测试数据库ImageDB,并建立ImageTable表来存储图像数据:
  CREATE DATABASE ImageTest
  GO
  USE ImageTest;
  GO
  CREATE TABLE ImageTable
  (
  ImageData varBinary(MAX)
  );
  然后使用Insert命令将其插入到ImageTest表中(此处图像文件为C:\aa.jpg),OPENROWSET函数包含访问OLE DB数据源中的远程数据所需的全部连接信息,内置的 BULK 访问接口支持大容量操作,实现的代码为:
INSERT INTO ImageTable (ImageData)
   SELECT  *
   FROM OPENROWSET(BULK N'C:\aa.jpg', SINGLE_BLOB) AS Photo
GO
  运行Select * from ImageTable语句将会看到该图像的二进制编码,但SQL Server 2008不提供直接查看图片的方法,为了查看图片,我们需要创建应用程序,本文第4部分介绍其实现的方法。
 
3 在SQL Server中将二进制数据复制到图像文件
  在SQL Server 2008中将二进制数据复制到图像文件,要对Windows的文件进行操作,我们需要用到xp_cmdshell扩展存储过程,在使用之前我们需获得执行该命令的权限:
   EXEC sp_configure 'show advanced options', 1
   GO
   RECONFIGURE
   GO
   EXEC sp_configure 'xp_cmdshell', 1
   GO
   RECONFIGURE
   GO
  通过执行xp_cmdshell将二进制数据复制到图像文件:
  EXEC   master..xp_cmdshell   'bcp "SELECT ImageData FROM ImageTest.dbo.ImageTable" queryout "c:\bb.jpg"-T -c'
  Go
  可以看到C盘下增加了一个图像文件bb.jpg。
 
4 使用C#.NET存取SQL Server 2008中的图像数据
  为在2中创建的ImageTable表添加一个ImagePath字段,用于记录图像的路径及文件名。
在窗体上添加一个按钮,用于实现将图像文件读入SQL Server,实现的基本过程是先通过openFileDialog控件选择要读入的图像文件,将图像文件转换成二进制流,连接数据库后使用insert命令将二进制流数据存储到SQL Server,实现的代码如下:
  this.openFileDialog1.ShowDialog();
  string file = this.openFileDialog1.FileName;
  try
  {
     SqlConnection sqlConnection = new SqlConnection(@"Data   Source=.\weisql;Initial Catalog=ImageTest;Integrated Security=True");
   sqlConnection.Open();
   FileStream byteStream  = new FileStream(file, FileMode.Open, FileAccess.Read);
   byte[] byteImage = new byte[byteStream .Length];  //图像文件转换成二进制流
   byteStream .Read(byteImage, 0, (int)byteStream .Length);
   string comText = "Insert into ImageTable(ImagePath, ImageData)Values(@ImagePath, @ImageData)";
   SqlCommand sqlCommand = new SqlCommand(comText, sqlConnection);
   sqlCommand.Parameters.Add("@ImagePath", SqlDbType.Text);     
   sqlCommand.Parameters.Add("@ImageData", SqlDbType.Binary);       sqlCommand.Parameters["@ImagePath"].Value = file;
   sqlCommand.Parameters["@ImageData"].Value = byteImage;
 sqlCommand.ExecuteNonQuery();
   System.Windows.Forms.Application.DoEvents();
   sqlConnection.Close();
   }
    catch (SqlException ex)
        {
           MessageBox.Show(ex.ToString());
        }
     MessageBox.Show("已将文件添加到SQL Server,点击“显示图片”查看");
  
  再添加一个按钮,用于实现将SQL Server中二进制数据显示为图像,连接数据库后将ImageTable表的记录绑定到dataGridView控件,虽然dataGridView控件可以将二进制数据显示为图片,但行列间距太小,不好看,所以同时还将图像显示在pictureBox控件中,实现的代码如下:
  try
  {
      SqlConnection sqlConnection = new SqlConnection(@"Data Source=.\weisql;Initial Catalog=ImageTest;Integrated Security=True");
      sqlConnection.Open();
      string comText = "Select ImagePath, ImageData from ImageTable";
      SqlDataAdapter adapter = new SqlDataAdapter(comText, sqlConnection);
      DataTable dt = new DataTable();
      adapter.Fill(dt);
      this.dataGridView1.DataSource = dt;
SqlCommand sqlCommand = new SqlCommand(comText, sqlConnection);
      SqlDataReader dr = sqlCommand.ExecuteReader();
      dr.Read();
      MemoryStream ms = new MemoryStream((byte[])dr[1] );
      Image img = Image.FromStream(ms);
      pictureBox1.Image = img;
      sqlConnection.Close();
  }
  catch (SqlException ex)
  {
      MessageBox.Show(ex.ToString());
   }
程序结果如图1所示。
图1  程序运行结果
 
5 结束语
  以上实例在Windows XP操作系统平台上, 采用面向对象的编程环境C#.NET作为前台开发工具、SQL Server2008作为后台数据库服务器调试通过,对有类似需求的开发项目有一定的参考价值。
 
参考文献
[1]刘奎,付青,张权.SQL Server 2008中文版从入门到精通[M].北京:化学工业出版社,2009.
[2]阿格沃尔,哈德莱斯顿 . C# 2008数据库入门经典[M].北京:清华大学出版社,2009.
 
 
【作者简介】韦善周(1978-),男,广西机电职业技术学院讲师、工程师,广西师范大学在职研究生,研究方向:图像处理,数据库。
   
关于我们 | 版权声明 | 广告服务 | 网站地图 | 联系方式
Copyright© 2005 QGKJLW.COM All Rights Reserved. 版权所有.《轻工科技》编辑部
工作QQ:373180636 投稿信箱:qgkj@vip.126.com 咨询电话:0771-4518435 4518909转8968
通讯地址: 广西南宁经济技术开发区迎凯路8号《轻工科技》编辑部 邮编:530031