• 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;
    }
  • 相关阅读:
    Django-models,继承AbstractUser类
    Django-views,用户认证,login_requierd()
    django前篇
    jquery插件
    jquery事件及插件
    jquery操作元素
    jquery选择器筛选器
    js作用域与作用域链
    js之DOM(二)
    bootstrap
  • 原文地址:https://www.cnblogs.com/wfyfngu/p/1307390.html
Copyright © 2020-2023  润新知