在Sql Server中存储、读写Word文件,需要将指定表字段添加为Image类型,示例表结构为:
1 CREATE TABLE CONTRACTS (
2 ID VARCHAR (50),
3 CONTRACT_FILE IMAGE
4 );
CONTRACT_FILE字段就是要存储Word文件的字段,在存储前,有一个小插曲,你需要将Word文件转换为byte数组,可参考以下代码实现:
1 //将文件转换为byte数组
2 public static byte[] File2Bytes(string fileName)
3 {
4 FileStream fs = new FileStream(fileName,FileMode.OpenOrCreate, FileAccess.Read);
5 byte[] fileDatas = new byte[fs.Length];
6 fs.Read(fileDatas, 0, System.Convert.ToInt32(fs.Length));
7 fs.Close();
8 return fileDatas;
9 }
接下来就是将转换后的byte[]数组存储到SqlServer的对应字段中,具体实现代码可看如下代码段:
01 //将文件存储到数据库
02 public bool UpdateContractFile(string id, byte[] fileBytes)
03 {
04 string sql = "UPDATE CONTRACTS SET CONTRACT_FILE=@CONTRACT_FILE WHERE ID=@ID";
05 using (SqlConnection conn = new SqlConnection(this.m_DataAccess.ConnectString))
06 {
07 conn.Open();
08 using (SqlCommand cmd = new SqlCommand())
09 {
10 cmd.Connection = conn;
11 cmd.CommandText = sql;
12 cmd.Parameters.Clear();
13 cmd.Parameters.Add(new SqlParameter("@CONTRACT_FILE", SqlDbType.Image));
14 cmd.Parameters["@CONTRACT_FILE"].Value = fileBytes;
15 cmd.Parameters.Add(new SqlParameter("@ID", SqlDbType.VarChar));
16 cmd.Parameters["@ID"].Value = id;
17 return cmd.ExecuteNonQuery() > 0 ? true : false;
18 }
19 }
20 }
同时,因之前转换了数据类型,所以从数据库中读取Word文件时,要先将Image类型的字段转换为bytes[],代码如下:
01 //通过ID获取文件byte数组
02 public byte[] GetContractFile(string id)
03 {
04 string sql = "SELECT CONTRACT_FILE FROM CONTRACTS WHERE ID='{0}'";
05 sql = string.Format(sql, id);
06 object contractFile;
07 contractFile = this.m_DataAccess.ExecuteScalar(sql);
08 if (contractFile == null)
09 {
10 return new byte[0];
11 }
12 else
13 {
14 return (byte[])contractFile;
15 }
16 }
在获取到文件的byte[]后,将该文件再通过文件流存储为Word文件,以下代码可实现此功能:
01 //将byte[]数组存储为Word文件
02 byte[] fileBytes = this.m_ContractsBusiness.GetContractFile(id);
03 if (fileBytes.Length == 0)
04 {
05 XMessageBox.ShowError("未找到合同文件!");
06 return;
07 }
08 SaveFileDialog sfd = new SaveFileDialog();
09 sfd.Filter = "Word文件(*.doc)|*.doc";
10 if (sfd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
11 {
12 try
13 {
14 string saveFileName = sfd.FileName;
15 int arraysize = new int();
16 arraysize = fileBytes.GetUpperBound(0);
17 FileStream fs = new FileStream(saveFileName, FileMode.OpenOrCreate, FileAccess.Write);
18 fs.Write(fileBytes, 0, arraysize);
19 fs.Close();
20 if (XMessageBox.ShowQuestion("文件存储成功,是否立即打开文件?") ==
21 System.Windows.Forms.DialogResult.Yes)
22 {
23 Process.Start(saveFileName);
24 }
25 }
26 catch (Exception ex)
27 {
28 XMessageBox.ShowError("操作失败!");
29 }
上面的几段代码只是核心代码,并不是完整的代码段,用时候要看清,自己再修改下。
from:https://zhidao.baidu.com/question/1668174604263928547.html

最新文章

  1. Winform 图片鼠标滚动查看(放大,缩小,旋转,拖动查看)[日常随笔]
  2. ie兼容整理
  3. Machine Learning for hackers读书笔记(五)回归模型:预测网页访问量
  4. sql之left join、right join、inner join的区别(转)
  5. cf D. Levko and Array
  6. 哥德尔,图灵和康托尔 part 1 哥德尔编号
  7. 基于Visual C++2013拆解世界五百强面试题--题13-找最大公共子字符串
  8. 前端基础之CSS-Day13
  9. 玩转spring mvc(六)---自定义异常跳转页面
  10. 手把手教你学会用Spring AOP
  11. 全景3d
  12. postman发送json格式的post请求
  13. linux ssh 应用
  14. RabbitMQ 相关理论部分
  15. How to hide the create button dynamical tree view in openerp ?
  16. 【C#/WPF】图像变换的Undo撤销——用Stack命令栈
  17. Docker学习笔记四:Docker镜像、容器管理工具shipyard
  18. a 标签的跳转属性
  19. Vue——关于css过渡和动画那些事
  20. ACM3018欧拉回路

热门文章

  1. 基于Java的在线聊天室
  2. 基于skitter的轮播图炫酷效果,幻灯片的体验
  3. MySQL-LAST_INSERT_ID();使用注意事项
  4. c语言中怎样用scanf()读入带空格的字符串?
  5. jenkins 下载插件失败处理办法
  6. 使用VS2012遇到的问题
  7. 最简单的TCP网络封包解包(补充)-序列化
  8. 安装配置PhoneGap开发环境(二)——使用Cordova取代PhoneGap创建项目
  9. Android Bitmap和Canvas学习笔记
  10. tornado异步web请求