我希望获取运行报告的结果(来自Crystal Reports的PDF文件),将其序列化,将其粘贴到varbinary字段中,然后再将其反序列化并将其呈现给用户。
现在我只需要简单的旧ADO .NET(SqlClient,SqlCommand等)
这有什么陷阱吗?鉴于我知道当前保存PDF文件的本地机器上的路径,实现此目的的基本语法是什么?
答案 0 :(得分:5)
编辑:刚刚在MSDN documentation中看到图片即将被移除。更好地使用VARBINARY(MAX)。 (嘿,我不知道)。
MY OLD ANSWER: VARBINARY的限制为8 KB。可能太小而无法存储PDF文件。您最好使用IMAGE数据类型。
使用参数通过SqlCommand插入/选择数据,您可以像任何普通字段一样使用纯SQL。
传递到图像字段的数据是一个字节数组。
编辑2:由于您使用的是C#,因此您应该使用DataReader检索数据。要创建DataReader,请使用SqlCommand.ExecuteReader上的SequentialAccess标志,以防止数据过早地被读入内存。
答案 1 :(得分:3)
我根本不会使用byte[]
参数来IDbCommand
。如果你的PDF是100 Mb大怎么办?据我所知,在将结果发送到请求的浏览器之前,这将从您的数据库中获取所有100 Mb(在服务器上需要大量内存)。现在考虑获得大约这个大小的不同PDF的大量并发请求......每秒...这不是很可扩展。
有关可能的解决方案,请查看"Blob + Stream = BlobStream",这是我几年前在荷兰为.NET杂志撰写的一篇文章。此方法使用SQL Server命令从Stream
派生类访问BLOB的部分内容。
这篇文章是荷兰语,但the example代码随附它应该足以让你入门。此外,Peter De Jonghe似乎编写了一篇article on CodeProject,它对我的文章进行了一些扩展,将其概括为SQL Server中的image
列。这篇文章是英文的。
我希望这可以帮助您解决问题。