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;
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个问题:

  1. 我们这样才能读取 SqlServer 中的一个 image 列,并赋值给 EmployeeInfo.Photo
  2. 怎样将一个 byte[] 类型写入到 SqlServer 的 image 列
  3. 上传的文件怎样转化为 byte[] 以方便第二步的写入操作

下面我们逐一解决。

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

if (!reader.IsDBNull(2)) {
    
// 读取流的长度
    long len = reader.GetBytes(20null00);
    
// 创建一个 byte 数组用来接收 image 列中的数据
    Byte[] buffer = new Byte[len];
    
// 开始从文件的头读取,知道文件结束
    reader.GetBytes(20, 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;
}
原文地址:https://www.cnblogs.com/wfyfngu/p/1307390.html