C# sql数据库中word文档的保存和读取

C# sql数据库中word文档的保存和读取,第1张

在Sql Server中存储、读写Word文件,需要将指定表字段添加为Image类型,示例表结构为:

1CREATE TABLE CONTRACTS (

2ID VARCHAR (50),

3CONTRACT_FILE IMAGE

4)

CONTRACT_FILE字段就是要存储Word文件的字段,在存储前,有一个小插曲,你需要将Word文件转换为byte数组,可参考以下代码实现:

1//将文件转换为byte数组

2public 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//将文件存储到数据库

02public bool UpdateContractFile(string id, byte[] fileBytes)

03{

04string sql = "UPDATE CONTRACTS SET CONTRACT_FILE=@CONTRACT_FILE WHERE ID=@ID"

05using (SqlConnection conn = new SqlConnection(this.m_DataAccess.ConnectString))

06{

07conn.Open()

08using (SqlCommand cmd = new SqlCommand())

09{

10cmd.Connection = conn

11cmd.CommandText = sql

12cmd.Parameters.Clear()

13cmd.Parameters.Add(new SqlParameter("@CONTRACT_FILE", SqlDbType.Image))

14cmd.Parameters["@CONTRACT_FILE"].Value = fileBytes

15cmd.Parameters.Add(new SqlParameter("@ID", SqlDbType.VarChar))

16cmd.Parameters["@ID"].Value = id

17return cmd.ExecuteNonQuery() >0 ? true : false

18}

19}

20}

同时,因之前转换了数据类型,所以从数据库中读取Word文件时,要先将Image类型的字段转换为bytes[],代码如下:

01//通过ID获取文件byte数组

02public byte[] GetContractFile(string id)

03{

04string sql = "SELECT CONTRACT_FILE FROM CONTRACTS WHERE ID='{0}'"

05sql = string.Format(sql, id)

06object contractFile

07contractFile = this.m_DataAccess.ExecuteScalar(sql)

08if (contractFile == null)

09{

10return new byte[0]

11}

12else

13{

14return (byte[])contractFile

15}

16}

在获取到文件的byte[]后,将该文件再通过文件流存储为Word文件,以下代码可实现此功能:

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

02byte[] fileBytes = this.m_ContractsBusiness.GetContractFile(id)

03if (fileBytes.Length == 0)

04{

05XMessageBox.ShowError("未找到合同文件!")

06return

07}

08SaveFileDialog sfd = new SaveFileDialog()

09sfd.Filter = "Word文件(*.doc)|*.doc"

10if (sfd.ShowDialog() == System.Windows.Forms.DialogResult.OK)

11{

12try

13{

14string saveFileName = sfd.FileName

15int arraysize = new int()

16arraysize = fileBytes.GetUpperBound(0)

17FileStream fs = new FileStream(saveFileName, FileMode.OpenOrCreate, FileAccess.Write)

18fs.Write(fileBytes, 0, arraysize)

19fs.Close()

20if (XMessageBox.ShowQuestion("文件存储成功,是否立即打开文件?") ==

21System.Windows.Forms.DialogResult.Yes)

22{

23Process.Start(saveFileName)

24}

25}

26catch (Exception ex)

27{

28XMessageBox.ShowError(" *** 作失败!")

29}

上面的几段代码只是核心代码,并不是完整的代码段,用时候要看清,自己再修改下。

在数据库中存放这些个二进制文件的字段是BLOB,oracle和MysqL里面都是

java中读取 BLOB数据:

首先做查询,拿到查询结果ResultSet rs = XXXX (和普通数据查询一样)

然后:Blob blob = rs.getBlob("字段名")拿到你的Blob ,

得到文件的二进制流:InputStream binaryStream= blob.getBinaryStream(),

你的文件数据就在这个流当中,你想怎么用就怎么取,比如,读出来存到一个byte[]中,以便序列化传输,读出来构造成一个File直接存放到本地等等。

举个例子吧:从这个binaryStream中读取数据到byte[]的方法,

////////---------------------

/**

* 从binaryStream中读取数据到byte[]的方法

* @param in 即binaryStream

* @return

* @throws Exception

*/

public static byte[] readStreamToByteArray(InputStream in) throws Exception{

ByteArrayOutputStream outputStream = new ByteArrayOutputStream()

byte[] buffer = new byte[1024]

int len = -1

while((len = in.read(buffer)) != -1) {

outputStream.write(buffer, 0, len)

}

outputStream.close()

in.close()

return outputStream.toByteArray()

}

//

用文件流的方式,把从文件中读出的数据转换成二进制,从数据库中读出就是反方向的:

private void button1_Click(object sender, EventArgs e)

{

byte[] buffer

buffer = File.ReadAllBytes("readme.doc")//读取文件内容

//创建连接

SqlConnection connect = new SqlConnection(@"Integrated Security=SSPIPersist Security Info=FalseInitial Catalog=BSPlatform2008Data Source=.\SqlExpress")

SqlCommand cmd = connect.CreateCommand()

cmd.CommandText = "INSERT INTO Tmp (FileContent) VALUES (@FileContent)"//FileContent字段是Image类型

cmd.Parameters.Add("@FileContent", SqlDbType.Image)

cmd.Parameters["@FileContent"].Value = buffer//接受byte[]类型的值

connect.Open()

cmd.ExecuteNonQuery()

connect.Close()

}


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/sjk/6651542.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-03-26
下一篇2023-03-26

发表评论

登录后才能评论

评论列表(0条)

    保存