您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > 电子商务 > sqlserver图片数据的存取
SQLSERVER中进行图像存取的实现方法在数据库应用项目开发中,经常会使用一些二进制的图像数据,存储和读取显示图像数据主要采用的是路径链接法和内存流法。路径链接法是将图像文件保存在固定的路径下,数据库中只存储图像文件的路径和名称,此方法数据库容量小,存取速度快,但安全性较差;内存流法是将二进制数据直接存储在数据库中,此方法对数据的共享非常方便,安全性相对较高,常用于图像容量不是很大的时候。本文主要讨论通过SQLServer2008使用内存流法如何实现二进制图像数据的存储。1VARBINARY(MAX)数据类型简介在SQLServer2000和更早的版本中,如果每条记录的数据量远远超过了一个单独记录的8K,我们常用IMAGE数据类型以二进制存储该数据,在使用IMAGE数据类型时,数据是不和普通数据存储在一起的。一个被称作指针的很小的二进制值,和普通数据存储在一起,这个二进制值指向数据文件里的数据实际存储的位置。对IMAGE数据进行读取、插入数据时需要使用READTEXT[1]及WRITETEXT命令,这两个命令需使用TEXTPTR函数来获得正确的二进制指针,这个二进制指针用于定位物理文件中的数据,使用起来较麻烦。虽然在SQLServer2008中依然提供IMAGE数据类型,但微软计划在未来的SQLServer版本中删除IMAGE数据类型,用VARBINARY(MAX)数据类型来代替,在该版本下不应当使用IMAGE这种类型。VARBINARY(MAX)为可变长度二进制数据,不限最大长度,常用于数据超出8,000字节时,可以直接使用insert命令添加数据,使用起来较简单。2使用T-SQL语句将图像文件直接读入VARBINARY(MAX)字段首先在SQLServer2008的查询窗口中创建测试数据库ImageDB,并建立ImageTable表来存储图像数据:CREATEDATABASEImageTestGOUSEImageTest;GOCREATETABLEImageTable(ImageDatavarBinary(MAX));然后使用Insert命令将其插入到ImageTest表中(此处图像文件为C:\aa.jpg),OPENROWSET函数包含访问OLEDB数据源中的远程数据所需的全部连接信息,内置的BULK访问接口支持大容量操作,实现的代码为:INSERTINTOImageTable(ImageData)SELECT*FROMOPENROWSET(BULKN'C:\aa.jpg',SINGLE_BLOB)ASPhotoGO运行Select*fromImageTable语句将会看到该图像的二进制编码,但SQLServer2008不提供直接查看图片的方法,为了查看图片,我们需要创建应用程序,本文第4部分介绍其实现的方法。3在SQLServer中将二进制数据复制到图像文件在SQLServer2008中将二进制数据复制到图像文件,要对Windows的文件进行操作,我们需要用到xp_cmdshell扩展存储过程,在使用之前我们需获得执行该命令的权限:EXECsp_configure'showadvancedoptions',1GORECONFIGUREGOEXECsp_configure'xp_cmdshell',1GORECONFIGUREGO通过执行xp_cmdshell将二进制数据复制到图像文件:EXECmaster..xp_cmdshell'bcpSELECTImageDataFROMImageTest.dbo.ImageTablequeryoutc:\bb.jpg-T-c'Go可以看到C盘下增加了一个图像文件bb.jpg。4使用C#.NET存取SQLServer2008中的图像数据为在2中创建的ImageTable表添加一个ImagePath字段,用于记录图像的路径及文件名。在窗体上添加一个按钮,用于实现将图像文件读入SQLServer,实现的基本过程是先通过openFileDialog控件选择要读入的图像文件,将图像文件转换成二进制流,连接数据库后使用insert命令将二进制流数据存储到SQLServer,实现的代码如下:this.openFileDialog1.ShowDialog();stringfile=this.openFileDialog1.FileName;try{SqlConnectionsqlConnection=newSqlConnection(@DataSource=.\weisql;InitialCatalog=ImageTest;IntegratedSecurity=True);sqlConnection.Open();FileStreambyteStream=newFileStream(file,FileMode.Open,FileAccess.Read);byte[]byteImage=newbyte[byteStream.Length];//图像文件转换成二进制流byteStream.Read(byteImage,0,(int)byteStream.Length);stringcomText=InsertintoImageTable(ImagePath,ImageData)Values(@ImagePath,@ImageData);SqlCommandsqlCommand=newSqlCommand(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(SqlExceptionex){MessageBox.Show(ex.ToString());}MessageBox.Show(已将文件添加到SQLServer,点击“显示图片”查看);再添加一个按钮,用于实现将SQLServer中二进制数据显示为图像,连接数据库后将ImageTable表的记录绑定到dataGridView控件,虽然dataGridView控件可以将二进制数据显示为图片,但行列间距太小,不好看,所以同时还将图像显示在pictureBox控件中,实现的代码如下:try{SqlConnectionsqlConnection=newSqlConnection(@DataSource=.\weisql;InitialCatalog=ImageTest;IntegratedSecurity=True);sqlConnection.Open();stringcomText=SelectImagePath,ImageDatafromImageTable;SqlDataAdapteradapter=newSqlDataAdapter(comText,sqlConnection);DataTabledt=newDataTable();adapter.Fill(dt);this.dataGridView1.DataSource=dt;SqlCommandsqlCommand=newSqlCommand(comText,sqlConnection);SqlDataReaderdr=sqlCommand.ExecuteReader();dr.Read();MemoryStreamms=newMemoryStream((byte[])dr[1]);Imageimg=Image.FromStream(ms);pictureBox1.Image=img;sqlConnection.Close();}catch(SqlExceptionex){MessageBox.Show(ex.ToString());}程序结果如图1所示。图1程序运行结果5结束语以上实例在WindowsXP操作系统平台上,采用面向对象的编程环境C#.NET作为前台开发工具、SQLServer2008作为后台数据库服务器调试通过,对有类似需求的开发项目有一定的参考价值。使用image类型保存图片数据文章描述的是SQLServer存储图像数据,我们大家都知道SQLServer数据库中的图像数据的存储机制在MISSQLServer数据库中,对于小于8000个字节的图像数据,其可以用二进制型(binary、varbinary)来表示。但通常要保存的一些医学影像图片都会大于8000个字节。SQLServer提供了一种机制,能存储每行大到2G的二进制对象(BLOB),这类对象可包括image、text和ntext三种数据类型。Image数据类型存储的是二进制数据,最大长度是231-1(2,147,483,647)个字节[2][3]。BLOB数据在MISSQLServer存储图像数据系统中的存储方式不同于普通的数据类型,对于普通类型的数据系统直接在用户定义的字段上存储数据值,而对于BLOB类型数据,系统开辟新的存储页面来存放这些数据,表中BLOB类型数据字段存放的仅是一个16个字节的指针,该指针指向存放该条记录的BLOB数据的页面。2、SQLServer中图像数据的存取在MISSQLServer存储图像数据中,当数据小于8000个字节时,可以用普通的SQL操纵语句(SELECT、INSERT、UPDATE、DELETE)来完成对字段的操纵,当数据大于8000个字节时,SQL提供了WRITETEXT、READTEXT和UPDATETEXT这三个函数来读取和修改数据。这三个函数的使用方法为:(1)WRITETEXT{table.columntext_ptr}[WITHLOG]table.column为表中的字段,text_ptr为一个16个字节的指针,data为要写的数据值。可选参数WITHLOG表示是否要写入日志文件中。例:以下是代码片段:DECLARE@ptrvalbinary(16)--指针SELECT@ptrval=TEXTPTR(img_ct)FROMzy_ctWHEREid_ct=20010101001WRITETEXTzy_ct.img_ct@ptrval0x024324142342134214213421421454353452341(2)READTEXT{table.columntext_ptroffsetsize}[HOLDLOCK]table.column为表中的字段,text_ptr为一个16个字节的指针,offset为偏移量,即从第几个字节开始读数据,size为要读的字节数,HOLDLOCK为在读数据中是否充许其他用户修改该数据。例:以下是代码片段:DECLARE@ptrvalvarbinary(16)SELECT@ptrval=TEXTPTR(img_ct)FROMzy_ctWHEREid_ct=20010101001READTEXTzy_ct.img_ct@ptrval125(3)UPDATETEXT{table_name.dest_column_namedest_text_ptr}{NULL|delete_length}[WITHLOG][inserted_data|{table_name.src_column_namesrc_text_ptr}]table_name.dest_column_name为要修改的text,ntext,或image字段;dest_text_ptr为指向其的指针;insert_offset为偏移量,对于text和image为从第几开始字节
本文标题:sqlserver图片数据的存取
链接地址:https://www.777doc.com/doc-2860237 .html