c#读写MSSQL数据库image字段内容
一:MSSQL帮助说明
Microsoft SQL Server 2005 将超过 8,000 个字符的字符串和大于 8,000 字节的二进制数据存储为名为 text 和 image 的特殊数据类型。超过 4,000 个字符的 Unicode 字符串存储为 ntext 数据类型。
例如,您需要将一个大型客户信息文本文件 (.txt) 导入 SQL Server 数据库。应将这些数据作为一个数据块存储起来,而不是集成到数据表的多个列中。为此,可以创建一个 text 数据类型的列。但是,如果必须存储公司徽标,它们当前存储为标记图像文件格式 (TIFF) 图像 (.tif) 且每个图像的大小为 10 KB,则可以创建一个 image 数据类型的列。
如果要存储的文本数据是 Unicode 格式,那么应使用 ntext 数据类型。例如,一个为国际客户创建的套用信函很可能包含用于各种不同语言的国际拼写和字符。这种数据应存储在 ntext 列中。
image 数据中的数据被存储为位串,SQL Server 不对其进行解释。对 image 列中的数据的任何解释都必须由应用程序来完成。例如,应用程序可以用 BMP、TIFF、GIF 或 JPEG 格式将数据存储在 image 列中。从 image 列中读取数据的应用程序必须能够识别数据的格式并正确显示数据。image 列所做的全部工作就是提供一个位置,以存储组成图像数据值的位流。
详见:MSSQL连机帮助
二:操作例子
操作image字段的核心就在于,理解它是一个位串,保存的十六进制位数,例如 Ox12a1。C#读出的时候需要将byte类型数据转化为Image图片,在写入时需要将Image图片以流的形式转为为byte数组,然后再将byte数组保存到Image字段.
下面使用详细的例子来说明。
数据库脚本
create table table_img
(car_image image);
go
if object_id('AddImage')is not null
drop proc AddImage
Go
create procedure AddImage
@img image
as
begin
insert into table_img(car_image) select @img
end
Go
写入数据库
Bitmap myBitmap = new Bitmap("C:\\intro.gif");
MemoryStream ms = new MemoryStream();
myBitmap.Save(ms, System.Drawing.Imaging.ImageFormat.Gif);
byte[] bt = ms.GetBuffer();
SqlParameter parm = new SqlParameter("@img", SqlDbType.Image, bt.Length);
parm.Value = bt;
string connectionString = "Data Source=20090104-0956;Initial Catalog=test;User ID=sa;Password=";
string sqlstr = "AddImage ";
SqlHelper.ExecuteDataset(connectionString, System.Data.CommandType.StoredProcedure, sqlstr,parm);
读出
string connectionString = "Data Source=20090104-0956;Initial Catalog=test;User ID=sa;Password=";
string sqlstr = "select car_image from table_img ";
DataSet dataSet = SqlHelper.ExecuteDataset(connectionString, System.Data.CommandType.Text, sqlstr);
DataRow dr=dataSet.Tables[0].Rows[0];
byte[] content = (byte[])dr["car_image"];
MemoryStream ms = new MemoryStream();
ms.Write(content, 0, content.Length);
Bitmap myBitmap = new Bitmap(ms);
pictureBox1.Image = myBitmap;