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

本文涉及的产品
云数据库 RDS SQL Server,基础系列 2核4GB
简介:

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

 

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

1
2
3
4
CREATE  TABLE  CONTRACTS ( 
     ID  VARCHAR  (50), 
     CONTRACT_FILE IMAGE 
); 

 

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/// 将文件转换为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[]存储到数据库的对应字段:

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
/// 将文件存储到数据库 
/// <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[],具体代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/// 通过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文件

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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( "下载文件失败!" ); 
     }

 

 

 

 

 

没有整理与归纳的知识,一文不值!高度概括与梳理的知识,才是自己真正的知识与技能。 永远不要让自己的自由、好奇、充满创造力的想法被现实的框架所束缚,让创造力自由成长吧! 多花时间,关心他(她)人,正如别人所关心你的。理想的腾飞与实现,没有别人的支持与帮助,是万万不能的。




    本文转自wenglabs博客园博客,原文链接:http://www.cnblogs.com/arxive/p/5699763.html ,如需转载请自行联系原作者
相关文章
|
5月前
|
存储 监控 算法
基于 C# 的局域网计算机监控系统文件变更实时监测算法设计与实现研究
本文介绍了一种基于C#语言的局域网文件变更监控算法,通过事件驱动与批处理机制结合,实现高效、低负载的文件系统实时监控。核心内容涵盖监控机制选择(如事件触发机制)、数据结构设计(如监控文件列表、事件队列)及批处理优化策略。文章详细解析了C#实现的核心代码,并提出性能优化与可靠性保障措施,包括批量处理、事件过滤和异步处理等技术。最后,探讨了该算法在企业数据安全监控、文件同步备份等场景的应用潜力,以及未来向智能化扩展的方向,如文件内容分析、智能告警机制和分布式监控架构。
157 3
|
5月前
|
存储 SQL 数据库连接
C#程序调用Sql Server存储过程异常处理:调用存储过程后不返回、不抛异常的解决方案
本文分析了C#程序操作Sql Server数据库时偶发的不返回、不抛异常问题,并提出了解决思路。首先解析了一个执行存储过程的函数`ExecuteProcedure`,其功能是调用存储过程并返回影响行数。针对代码执行被阻塞但无异常的情况,文章总结了可能原因,如死锁、无限循环或网络问题等。随后提供了多种解决方案:1) 增加日志定位问题;2) 使用异步操作提升响应性;3) 设置超时机制避免阻塞;4) 利用线程池分离主线程;5) 通过信号量同步线程;6) 监控数据库连接状态确保可用性。这些方法可有效应对数据库操作中的潜在问题,保障程序稳定性。
446 11
|
10月前
|
C#
基于 C# 编写的 Visual Studio 文件编码显示与修改扩展插件
基于 C# 编写的 Visual Studio 文件编码显示与修改扩展插件
193 9
|
存储 C#
【C#】大批量判断文件是否存在的两种方法效率对比
【C#】大批量判断文件是否存在的两种方法效率对比
351 1
|
关系型数据库 MySQL 网络安全
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
|
监控 安全 C#
使用C#如何监控选定文件夹中文件的变动情况?
使用C#如何监控选定文件夹中文件的变动情况?
302 19
|
XML 存储 缓存
C#使用XML文件的详解及示例
C#使用XML文件的详解及示例
499 0
|
编译器 C# Windows
C#基础:手动编译一个.cs源代码文件并生成.exe可执行文件
通过上述步骤,应该能够高效准确地编译C#源代码并生成相应的可执行文件。此外,这一过程强调了对命令行编译器的理解,这在调试和自动化编译流程中是非常重要的。
1011 2
|
SQL 网络协议 数据库连接
已解决:连接SqlServer出现 provider: Shared Memory Provider, error: 0 - 管道的另一端上无任何进程【C#连接SqlServer踩坑记录】
本文介绍了解决连接SqlServer时出现“provider: Shared Memory Provider, error: 0 - 管道的另一端上无任何进程”错误的步骤,包括更改服务器验证模式、修改sa用户设置、启用TCP/IP协议,以及检查数据库连接语句中的实例名是否正确。此外,还解释了实例名mssqlserver和sqlserver之间的区别,包括它们在默认设置、功能和用途上的差异。
|
C# 图形学 数据安全/隐私保护
Unity数据加密☀️ 二、使用Rider将C#代码生成DLL文件
Unity数据加密☀️ 二、使用Rider将C#代码生成DLL文件

热门文章

最新文章