在为人事系统做操作日志功能时,为了保证已经打印的信函可以还原,需要在每次打印信函时记录Word信函的内容。
SQL Server只能记录信函的文字内容,那信函的页面布局、字体格式等其他内容如何存储呢?此时Mongodb闪亮登场,由于MongoDB的文档结构为BJSON格式(BJSON全称:Binary JSON),而BJSON格式本身就支持保存二进制格式的数据,因此可以把文件的二进制格式的数据直接保存到MongoDB的文档结构中。取的时候再以二进制格式取,这样文档就能实现无损保存。
下面是我已经验证成功,存储Word到Mongo,然后从Mongo读取Word的代码,在此和大家分享分享。
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.IO; using MongoDB.Bson; using MongoDB.Driver; namespace Mongodb { public partial class Form1 : Form { public Form1() { InitializeComponent(); Init(); } //数据库连接字符串 const string strconn = "mongodb://127.0.0.1:27017"; //数据库名称 const string dbName = "test"; MongoServer server; MongoDatabase db; void Init() { //创建数据库链接 server = MongoDB.Driver.MongoServer.Create(strconn); //获得数据库 db = server.GetDatabase(dbName); } private void btnSave_Click(object sender, EventArgs e) { SaveDocToMongo(@"d:\quwenzhe.docx"); } private void btnShow_Click(object sender, EventArgs e) { GetDocFromMongo(@"E:\newquwenzhe.doc"); } /// <summary> /// 保存Word到Mongo /// </summary> /// <param name="filename">需要保存的文件名</param> private void SaveDocToMongo(string filename) { byte[] byteDoc = File.ReadAllBytes(filename); BsonDocument doc = new BsonDocument(); doc["id"] = "1"; doc["content"] = byteDoc; MongoCollection col = db.GetCollection("doc"); col.Save(doc); } /// <summary> /// 将Mongo中的Word保存到本地 /// </summary> /// <param name="filename">保存到本地的文件名</param> private void GetDocFromMongo(string filename) { MongoCollection col = db.GetCollection("doc"); var query = new QueryDocument { { "id", "1" } }; var result = col.FindAs<BsonDocument>(query); byte[] buff = (byte[])((BsonDocument)result.ToList()[0]).GetValue("content"); FileStream fs; FileInfo fi = new FileInfo(filename); fs = fi.OpenWrite(); fs.Write(buff, 0, buff.Length); fs.Close(); } } }
执行完存储操作后,大家可以在MongoVUE中查看存储的二进制数据,如下图所示:
到此大功告成,弱弱的奉上源码下载地址:http://pan.baidu.com/s/1pJ5DTer。
好了,时间不早了,我得小憩一下,准备下午的软考,谢谢大家观看。
时间: 2024-10-09 19:43:58