gpt4 book ai didi

mysql - 使用 ODBC 读取整个 LOB 的最佳方法是什么?

转载 作者:可可西里 更新时间:2023-11-01 06:37:42 26 4
gpt4 key购买 nike

读取您事先不知道大小的整个 LOB(没有最大分配 + 副本)应该是一个相当普遍的问题,但是找到关于“正确”方法的良好文档和/或示例已经证明真让我抓狂。

我与 SQLBindCol 进行了较量,但看不到任何让它工作的好方法。 SQLDescribeColSQLColAttribute 返回的列元数据似乎是列大小的默认值或上限,而不是当前 LOB 的实际大小。最后,我决定使用以下内容:

1) 将任何/所有 LOB 列作为 SELECT 语句中编号最高的列

2) SQLPrepare语句

3) SQLBindCol 您想要的任何较早的非 LOB 列

4) SQLExecute语句

5) SQLFetch 一个结果行

6) SQLGetData 在您的 LOB 列上使用大小为 0 的缓冲区来查询其实际大小

7) 分配一个刚好足以容纳您的 LOB 的缓冲区

8) SQLGetData 再次在您的 LOB 列上使用正确大小的已分配缓冲区

9) 对后面的每个 LOB 列重复步骤 6-8

10) 对结果集中的任何更多行重复步骤 5-9

11) SQLCloseCursor 当你完成你的结果集时

这似乎对我有用,但似乎也很复杂。

对 SQLGetData 的调用是返回到服务器还是只处理已发送到客户端的结果?

服务器和/或客户端是否会拒绝以这种方式处理非常大的对象(例如 - 超过某个大小阈值,因此它们会生成错误)?

最重要的是,有没有更好的方法来做到这一点?

谢谢!

最佳答案

我看到有几项改进要做。

  1. 如果您需要分配缓冲区,那么您应该为所有记录和列分配一次。因此,您可以使用@RickJames 建议的技术,并使用 MAX 进行改进,如下所示:

    选择 MAX(LENGTH(blob1)) 作为 max1,MAX(LENGTH(blob2)) 作为 max2,...

您可以使用 max1max2 预先分配缓冲区,或者可能只为所有列分配最大的缓冲区。

  1. 在 1 处返回的缓冲区长度对于您的应用程序来说可能太大了。您可以在运行时决定缓冲区的大小。无论如何,SQLGetData 被设计为对每一列调用多次。只需再次调用它,使用相同的列号,它就会获取下一个 block 。可用字节数将保存在 StrLen_or_IndPtr(最后一个参数)指向的位置。每次调用后,此计数都会随着获取的字节数而减少。

当然,每次调用都会往返于服务器,因为所有这些的目的都是为了防止驱动程序获取超出应用程序处理能力的数据。

  1. 在这种情况下禁止将NULL 作为缓冲区指针传递以获得长度,检查SQLGetData。在 Microsoft 的文档上。

但是,您可以分配一个最小的缓冲区,比如 8 个字节,并传递它和它的长度。该函数将返回写入的字节数,在我们的例子中为 7,因为该函数添加了一个空字符,并将剩余字节数放入 StrLen_or_IndPtr。但是,如果您按照上述说明分配缓冲区,则可能不需要它。

注意:LOB 需要位于选择列表的末尾并且必须准确地按照该顺序获取。

关于mysql - 使用 ODBC 读取整个 LOB 的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50018049/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com