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;
}
假设我们需要创建一个员工信息表(表名: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;
}
相关文章推荐
- DAL 操作数据库方法ExecuteNonQuery/ExecuteScalar/SqlDataAdapter/SqlDataReader
- SQL优化的一些实用方法
- 关于SqlDataReader一些用法
- SqlDataReader属性方法
- SQL2005的SQL Server Management Studio对大数据库操作超时解决方法
- SqlDataReader的合适关闭方法?
- SqlDataReader的Read方法
- SqlServer try catch 捕获不到的一些错误及解决方法
- SqlDataReader 判断是否存在某列的方法
- SQL2005的SQL Server Management Studio对大数据库操作超时解决方法
- java操作sqlserver image字段
- SqlServer try catch 捕获不到的一些错误及解决方法
- powerdesigner for sqlserver的一些实用配置
- SqlDataReader的合适关闭方法?
- 操作Enum的一些实用方法
- SqlDataReader对象的NextResult方法读取存储过程多个结果集
- "SQL Server does not handle comparison of NText, Text, Xml, or Image data types."
- Windows Phone 数据库,删除提示 SQL Server does not handle comparison of NText, Text, Xml, or Image data types
- [网络收集]ASP.NET两种办法给DropDownList绑定SqlDataReader 及在gridview等控件中绑定dropdownlist的简单方法
- asp.net中SqlDataReader获取数据存在的问题解决方法