我在forum.asp.net中找到了KBrocksi_SEC的另一个很好的答案,所以我与您分享:
处理 BLOB 数据的常用替代方法是将 BLOB 数据存储在文件系统中,并将指针(最好是统一资源定位符 [URL] 链接)存储在数据库列中以引用适当的文件。
在数据库中存储 BLOB 数据的优势
在数据库中存储 BLOB 数据具有许多优点:
- 使 BLOB 数据与行中的其余项目保持同步更容易。
- BLOB 数据与数据库一起备份。拥有一个单一的存储系统可以简化管理。
- 可以通过SQL Server 2005 中的XML 支持访问 BLOB 数据,它可以返回 XML 流中数据的 base 64 编码表示。
- 可以对包含固定或可变长度字符(包括 Unicode)数据的列执行SQL Server 全文搜索 (FTS)操作。您还可以对图像字段中包含的基于文本的格式化数据执行 FTS 操作,例如 Microsoft Word 或 Microsoft Excel 文档。
在数据库中存储 BLOB 数据的缺点
仔细考虑哪些资源可能更好地存储在文件系统而不是数据库中。很好的例子是通常通过 HTTP HREF 引用的图像。这是因为:
- 与使用文件系统相比,从数据库中检索图像会产生大量开销。
- 数据库 SAN 上的磁盘存储通常比 Web 服务器场中使用的磁盘上的存储更昂贵。
以下代码显示如何使用 ADO.NET 将从文件中获取的二进制数据写入 SQL Server 中的图像字段。
public void StorePicture( string filename )
{
// Read the file into a byte array
using(FileStream fs = new FileStream(filename, FileMode.Open, FileAccess.Read))
{
byte[] imageData = new Byte[fs.Length];
fs.Read( imageData, 0, (int)fs.Length );
}
using( SqlConnection conn = new SqlConnection(connectionString) )
{
SqlCommand cmd = new SqlCommand("StorePicture", conn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@filename", filename );
cmd.Parameters["@filename"].Direction = ParameterDirection.Input;
cmd.Parameters.Add("@blobdata", SqlDbType.Image);
cmd.Parameters["@blobdata"].Direction = ParameterDirection.Input;
// Store the byte array within the image field
cmd.Parameters["@blobdata"].Value = imageData;
conn.Open();
cmd.ExecuteNonQuery();
}
}
我也可以自己在上述解释中添加另一个注释:
在数据库中存储 BLOB 数据的缺点
- 如果您的 BLOB 数据导致数据库繁重(当您在数据库中存储许多文件时),那么数据库备份过程可能需要更多时间才能完成并让您头疼。