SqlDataReader 操作 SqlServer image 列的一些实用方法
随着对 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.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 数组
// 读取流的长度
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 列
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[]
/// 将一个 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;
}