您的位置:首页 > 数据库

SqlDataReader 操作 SqlServer image 列的一些实用方法

2008-10-09 17:18 495 查看
随着对 ASP.NET 开发的深入,我们慢慢地开始抛弃或减少对 DataSet 和 DataTable 的使用,取而代之我们使用实体类和泛型集合来完成相同的功能。

假设我们需要创建一个员工信息表(表名:employee),包含以下字段:

employee_id char(36)

name varchar(50)

photo image

创建这样一个表很容易。之后,我们编写一个 EmployeeInfo 的实体类,用来和表 employee 中的各个字段对应。

using System;

namespace Test.Model {

public sealed class EmployeeInfo{

private string _employeeGUID;

private string _name;

private byte[] _photo;

public EmployeeInfo(){}

public string EmployeeGUID {

get {return _employeeGUID;}

set {_employeeGUID = value;}

}

public string Name {

get{return _name;}

set{_name=value;}

}

public byte[] Photo{

get {return _photo;}

set {_photo=value;}

}

}

}

实体类已经创建完成,接下来,我们还需要创建一个用于和数据库交换数据的类 EmployeeDAL,下面是伪码:

using System;

using System.Collections.Generic;

using System.Data;

using System.Data.SqlClient;

using Test.Model;

namespace Test.SqlServerDAL {

public sealed class EmployeeDAL {

/// <summary>

/// 获取具有指定 ID 的员工

/// </summary>

/// <param name="employeeID">员工ID</param>

public EmployeeInfo GetByEmployeeID(string employeeID) {

string sql = "SELECT * FROM employee WHERE employee_id=@eid";

using(SqlDataReader reader = SqlHelper.ExecuteReader(CommandType.Text, sql,

new SqlParameter("@eid", employeeID)

)) {

if(reader.Read()) {

EmployeeInfo info = new EmployeeInfo();

info.EmployeeGUID = reader.GetString(0);

info.Name = reader.GetString(1);

// TODO: 填充 EmployeeInfo.Photo

// EmployeeInfo.Photo = ?

}

return null;

}

}

}

}

到此为止,我们遇到了3个问题:

我们这样才能读取 SqlServer 中的一个 image 列,并赋值给 EmployeeInfo.Photo

怎样将一个 byte[] 类型写入到 SqlServer 的 image 列

上传的文件怎样转化为 byte[] 以方便第二步的写入操作

下面我们逐一解决。

一、使用 SqlDataReader 读取 SqlServer 的 image 列到一个 byte 数组

if (!reader.IsDBNull(2)) {

// 读取流的长度

long len = reader.GetBytes(2, 0, null, 0, 0);

// 创建一个 byte 数组用来接收 image 列中的数据

Byte[] buffer = new Byte[len];

// 开始从文件的头读取,知道文件结束

reader.GetBytes(2, 0, buffer, 0, (int)len);

// 赋值

EmployeeInfo.Photo = buffer;

}

二、将一个 byte[] 类型写入到 SqlServer 的 image 列

public void Insert(EmployeeInfo employee) {

string sql = "INSERT INTO employee (photo) values @photo";

SqlParameter img = new SqlParameter("@photo", SqlDbType.Image);

if(employee.Photo != null) {

img.Value = employee.Photo;

} else {

img.Value = DBNull.Value;

}

SqlHelper.ExecuteNoneQuery(CommandType.Text, sql, img);

}

三、上传的文件怎样转化为 byte[]

/// <summary>

/// 将一个 System.IO.Stream 转化为 byte[]

/// </summary>

/// <param name="fileStream"></param>

public byte[] FileStreamToByteArray(Stream fileStream) {

byte[] bytes = new byte[fileStream.Length];

fileStream.Read(bytes, 0, bytes.Length);

fileStream.Close();

return bytes;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: