出处 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("下载文件失败!");
}

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

  1. sql server 中后缀为.mdf的文件是干什么用的??

    在微软的SQL Server 2000 数据库有三种类型的文件: 1)主要数据文件(扩展名.mdf是 primary data file 的缩写) 主要数据文件包含数据库的启动信息,并指向数据库中的其 ...

  2. [转载]在SQL Server 中,如何实现DBF文件和SQL Server表之间的导入或者导出?

    原来使用SQL Server 2000数据库,通过DTS工具很方便地在SQL Server和DBF文件之间进行数据的导入和导出,现在安装了SQL Server2005之后,发现其提供的“SQL Ser ...

  3. SQL Server中2008及以上 ldf 文件过大的解决方法

    在SQL Server中经常遇到事务日志变大的情况,除了将数据库设置为“自动收缩”外,还可以使用下面的SQL命令进行快速清除数据库中的事务日志,命令如下:  - 第一步:清空日志  ALTER DAT ...

  4. SQL SERVER中的逻辑读取,物理读取,以及预读的理解

    在SQLSERVER查询分析器中,当我们用Set Statistics on 语句来统计SQL语句或者存储过程I/O的时候, SQLSERVER会显示几个概念去词语:逻辑读取,物理读取,预读. 如下: ...

  5. SQL Server中的TempDB管理——TempDB基本知识(为什么需要版本存储区)

    原文:SQL Server中的TempDB管理--TempDB基本知识(为什么需要版本存储区) 参考资料来自: http://blogs.msdn.com/b/sqlserverstorageengi ...

  6. SQL Server中TempDB管理(版本存储区的一个example)

    原文:SQL Server中TempDB管理(版本存储区的一个example) 原文来自: http://blogs.msdn.com/b/sqlserverstorageengine/archive ...

  7. SQL Server中的GUID

    GUID(Global unique identifier)全局唯一标识符,它是由网卡上的标识数字(每个网卡都有唯一的标识号)以及 CPU 时钟的唯一数字生成的的一个 16 字节的二进制值. GUID ...

  8. SQL Server 列存储索引强化

    SQL Server 列存储索引强化 SQL Server 列存储索引强化 1. 概述 2.背景 2.1 索引存储 2.2 缓存和I/O 2.3 Batch处理方式 3 聚集索引 3.1 提高索引创建 ...

  9. 在SQL Server中对视图进行增删改

    原文:在SQL Server中对视图进行增删改 Lesktop开源IM发布以后,有一些网友问及如何在嵌入IM后与自己网站的用户系统整合(即如何让嵌入的IM直接使用网站原有的用户数据库,而不需要将已有的 ...

随机推荐

  1. 【剑指offer】之字形打印二叉树,C++实现

    原创文章,转载请注明出处! 本题牛客网地址 博客文章索引地址 博客文章中代码的github地址 1.题目 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打 ...

  2. kettle连接oracle出现Error connecting to database: (using class oracle.jdbc.driver.OracleDriver)

    jdbc驱动,下载jdbc14.jar文件放入   pdi-ce-5.3.0.0-213\data-integration\libswt\win64里 之后重启kettle即可 jdbc14.jar文 ...

  3. BZOJ1113 Poi2008 海报PLA【单调栈】【水】

    BZOJ1113 Poi2008 海报PLA Description N个矩形,排成一排. 现在希望用尽量少的矩形海报Cover住它们. Input 第一行给出数字N,代表有N个矩形.N在[1,250 ...

  4. BZOJ5059 前鬼后鬼的守护 【堆扩展】*

    BZOJ5059 前鬼后鬼的守护 Description 八云紫的式神八云蓝有一张符卡名为[式神-前鬼后鬼的守护],这张符卡的弹幕为BOSS从两侧向自机发射大玉,大玉后面跟着一些小玉,形成一个&quo ...

  5. JQ 知识点集合

    数组与字符串间的转换 一.数组转字符串(将数组元素用某个字符连接成字符串) var a, b; a = new Array(0,1,2,3,4); b = a.join("-"); ...

  6. 《selenium2 python 自动化测试实战》(5)——键盘事件

    键盘事件,就是键盘上的一些操作,比如Ctrl +C,Ctrl+V,Ctrl+X等. 对键盘的操作需要导入另一个键盘的库: from selenium.webdriver.common.keys imp ...

  7. Oracle数据库安装完成后相关问题的解决

    笔者一直以来都是使用公司服务器上的oracle数据库,突然一天公司服务器宕机了,项目无法访问数据库跟着瘫痪了,所以准备在自己的机器上安装一个oracle数据库. 从官网下载安装了oracle 11g后 ...

  8. 【java基础】java集合之TreeMap

    转载文章转载请注明出处:http://www.cnblogs.com/skywang12345/admin/EditPosts.aspx?postid=3310928 第1部分 TreeMap介绍 T ...

  9. Nchan 安装试用(openresty 同时支持)

    备注:        使用nginx最新的源码包(nginx-1.13.6),以及源码安装   1. 下载源码包(nginx+ Nchan) https://nginx.org/download/ng ...

  10. Mac环境下PHPstorm配置xdebug开发调试web程序

    一.安装PHP的xdebug扩展 安装xdebug(技巧,为了找到适配的版本,让xdebug网站根据phpinfo()函数输出分析找到对应的方法及安装步骤:如果安装了多个PHP版本的话,尽量用phpi ...