zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    GhostBSD 3.0RC3,基于GNOME的FreeBSD
    Nagios 3.4.3 发布,企业级监控系统
    Jolokia 1.0.6 发布, JMX远程访问方法
    微软希望开发人员不要使 WebKit 成为新版 IE6
    Kwort Linux 3.5 正式版发布
    EJDB 1.0.24 发布,嵌入式 JSON 数据库引擎
    Pale Moon 15.3 Firefox“苍月”优化版发布
    Galera Load Balancer 0.8.1 发布
    SmartSVN V7.5 正式发布
    PostgresQL建立索引如何避免写数据锁定
  • 原文地址:https://www.cnblogs.com/wfyfngu/p/1307390.html
Copyright © 2011-2022 走看看