出处 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
,如需转载请自行联系原作者