在为人事系统做操作日志功能时,为了保证已经打印的信函可以还原,需要在每次打印信函时记录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。
好了,时间不早了,我得小憩一下,准备下午的软考,谢谢大家观看。