
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()
}
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)