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