当前位置: 首页 > news >正文

[转] C#实现在Sql Server中存储和读取Word文件 (Not Correct Modified)

出处 C#实现在Sql Server中存储和读取Word文件

 

要实现在Sql Server中实现将文件读写Word文件,需要在要存取的表中添加Image类型的列,示例表结构为:

    CREATE TABLE CONTRACTS (  
        ID VARCHAR (50),  
        CONTRACT_FILE IMAGE  
    );  

 

要将Word文件存储到数据库的CONTRACT_FILE字段中,需要将文件转换为byte数组,具体代码如下:

/// 将文件转换为byte数组  
/// <summary>  
/// 将文件转换为Bytes  
/// </summary>  
/// <param name="fileName"></param>  
/// <returns></returns>  
public static byte[] File2Bytes(string fileName)  
{  
    FileStream fs = new FileStream(fileName, FileMode.OpenOrCreate, FileAccess.Read);  
    byte[] fileDatas = new byte[fs.Length];  
    fs.Read(fileDatas, 0, System.Convert.ToInt32(fs.Length));  
    fs.Close();  
    return fileDatas;  
}

 
然后将转换完成的byte[]存储到数据库的对应字段:

 

/// 将文件存储到数据库  
/// <summary>  
/// 更新合同文件  
/// </summary>  
/// <param name="id"></param>  
/// <param name="fileBytes"></param>  
/// <returns></returns>  
public bool UpdateContractFile(string id, byte[] fileBytes)  
{  
    string sql = "UPDATE CONTRACTS SET CONTRACT_FILE=@CONTRACT_FILE WHERE ID=@ID";  
    using (SqlConnection conn = new SqlConnection(this.m_DataAccess.ConnectString))  
    {  
        conn.Open();  
        using (SqlCommand cmd = new SqlCommand())  
        {  
      cmd.Connection = conn;  
      cmd.CommandText = sql;  
      cmd.Parameters.Clear();  
      
      cmd.Parameters.Add(new SqlParameter("@CONTRACT_FILE", SqlDbType.Image));  
      cmd.Parameters["@CONTRACT_FILE"].Value = fileBytes;  
      
      cmd.Parameters.Add(new SqlParameter("@ID", SqlDbType.VarChar));  
      cmd.Parameters["@ID"].Value = id;  
      
      return cmd.ExecuteNonQuery() > 0 ? true : false;  
        }  
    }  
}

 

 

 

 

要读取数据库中存储的Word文件,需要先将Image类型的字段转换为bytes[],具体代码如下:

/// 通过ID获取文件byte数组  
/// <summary>  
/// 获取合同文件  
/// </summary>  
/// <param name="id"></param>  
/// <returns></returns>  
public byte[] GetContractFile(string id)  
{  
    string sql = "SELECT CONTRACT_FILE FROM CONTRACTS WHERE ID='{0}'";  
    sql = string.Format(sql, id);  
    object contractFile;  
    contractFile = this.m_DataAccess.ExecuteScalar(sql);  
    if (contractFile == null)  
    {  
return new byte[0];  
    }  
    else  
    {  
return (byte[])contractFile;  
    }  
} 

 


在获取到文件的byte[]后,将该文件通过文件流操作存储为Word文件,具体代码如下:

将byte[]数组存储为Word文件

 

byte[] fileBytes = this.m_ContractsBusiness.GetContractFile(id);  
if (fileBytes.Length == 0)  
{  
    XMessageBox.ShowError("未找到合同文件!");  
    return;  
}  
SaveFileDialog sfd = new SaveFileDialog();  
sfd.Filter = "Word文件(*.doc)|*.doc";  
if (sfd.ShowDialog() == System.Windows.Forms.DialogResult.OK)  
{  
    try  
    {  
        string saveFileName = sfd.FileName;  
        int arraysize = new int();//注意这句话  
        arraysize = fileBytes.GetUpperBound(0);  
        FileStream fs = new FileStream(saveFileName, FileMode.OpenOrCreate, FileAccess.Write);  
        fs.Write(fileBytes, 0, arraysize);  
        fs.Close();  
        if (XMessageBox.ShowQuestion("文件下载成功,是否立即打开文件?") ==  
            System.Windows.Forms.DialogResult.Yes)  
        {  
            Process.Start(saveFileName);  
        }  
    }  
    catch (Exception ex)  
    {  
        XMessageBox.ShowError("下载文件失败!");  
    }

 

 

 

 

 

相关文章:

  • 终极解决方案:windows10开机黑屏,死机
  • C#打印条码BarTender SDK打印之路和离开之路(web平凡之路)
  • 规范化安全开发 KOA 手脚架
  • mysql开启/关闭 update delete 安全模式
  • Bzoj1007 水平可见直线
  • NGINX与APACHE工作模式的区别
  • thymeleaf th:attr标签
  • linux基础(7)-IO重定向
  • 【Xcode command line】命令行工具
  • sql 语句中 idlt ;SELECT * FROM t_blog WHERE idlt;#{id} ORDER BY id DESC LIMIT 1
  • I/O多路转接之select
  • 【Qt笔记】绘制设备
  • gitlab smtp设置
  • C语言小知识,摘自o'reilly著C程序设计新思维,人民邮电出版社
  • gitlab https
  • 「前端早读君006」移动开发必备:那些玩转H5的小技巧
  • 【5+】跨webview多页面 触发事件(二)
  • Angularjs之国际化
  • C++入门教程(10):for 语句
  • interface和setter,getter
  • java取消线程实例
  • JS基础篇--通过JS生成由字母与数字组合的随机字符串
  • Laravel核心解读--Facades
  • Protobuf3语言指南
  • react-core-image-upload 一款轻量级图片上传裁剪插件
  • Service Worker
  • SQLServer之创建数据库快照
  • sublime配置文件
  • TCP拥塞控制
  • 初识 webpack
  • 关于使用markdown的方法(引自CSDN教程)
  • 扫描识别控件Dynamic Web TWAIN v12.2发布,改进SSL证书
  • #Linux杂记--将Python3的源码编译为.so文件方法与Linux环境下的交叉编译方法
  • (007)XHTML文档之标题——h1~h6
  • (八)五种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (翻译)terry crowley: 写给程序员
  • (附源码)springboot优课在线教学系统 毕业设计 081251
  • (简单) HDU 2612 Find a way,BFS。
  • (力扣记录)235. 二叉搜索树的最近公共祖先
  • (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境
  • (心得)获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列。
  • (转载)(官方)UE4--图像编程----着色器开发
  • .babyk勒索病毒解析:恶意更新如何威胁您的数据安全
  • .NET DevOps 接入指南 | 1. GitLab 安装
  • .NET 使用配置文件
  • .net对接阿里云CSB服务
  • .net企业级架构实战之7——Spring.net整合Asp.net mvc
  • .NET设计模式(8):适配器模式(Adapter Pattern)
  • /bin/bash^M: bad interpreter: No such file or directory
  • [ MSF使用实例 ] 利用永恒之蓝(MS17-010)漏洞导致windows靶机蓝屏并获取靶机权限
  • [2015][note]基于薄向列液晶层的可调谐THz fishnet超材料快速开关——
  • [BZOJ1040][P2607][ZJOI2008]骑士[树形DP+基环树]
  • [bzoj1912]异象石(set)
  • [C++从入门到精通] 14.虚函数、纯虚函数和虚析构(virtual)
  • [codevs] 1029 遍历问题