【问题标题】:C++ pre-determining the length of a VARCHAR using ODBC bound parametersC++ 使用 ODBC 绑定参数预先确定 VARCHAR 的长度
【发布时间】:2011-12-07 09:17:25
【问题描述】:

我一直在使用 Row-Wise、Column-Wise 和参数绑定来尝试找到一种方法来指向非顺序缓冲区数组以用于 VARCHAR 列返回。

返回可能有 10 个字符或 8000 个字符。显然我不想分配 8000 x nRows 字节的内存,所以我一直在尝试更好的方法。

第一个明显的方法是分配一个 8000 字节长的缓冲区,然后在 SqlFetchO() 返回列长度后,为返回分配正确的大小并复制它。由于副本很昂贵,我试图避免这种情况。

我的下一个想法是发出两个 SELECT 语句。第一个是:

SELECT DATALENGTH(Description) from SpecialOffer WHERE MinQty > 0

我不确定这有多贵,但假设实际上没有从数据库中复制任何数据,并且只是读取了 2 字节长度的字段,这可能会很快吗?在执行第二个查询之前,我可以分配一个数组,其中每个成员都具有确切的长度。

在 SQL Server 中检索行之前,有什么方法可以获取准确的 VARCHAR 列长度信息?

另外,有没有办法使用指定指向缓冲区指针的指针(即 ODBC 驱动程序要求的双重取消引用)。例如,这将允许我使用 Row-Wise 绑定和指向缓冲区的指针数组(使用第二种技术)。

【问题讨论】:

    标签: c++ sql-server-2008 odbc


    【解决方案1】:

    如果您使用 SQLPrepare 查询,则可以调用 SQLNumResultCols 查找列数,然后调用 SQLDescribeCol 获取每列的长度和数据类型,然后使用此信息分配和绑定数据缓冲区。然后使用 SQLExecute 和 SQLFetch 将数据返回到这些缓冲区中。

    【讨论】:

      【解决方案2】:

      Necro 在这里回答,但现有的回答并不能真正解决您的问题。不,在驱动程序检索行之前,无法获取给定行长度中给定列的实际长度。

      您要么需要分配比您需要的更多的内存(这可能是可接受的,也可能是不可接受的,具体取决于查询和应用程序),或者您需要使用 DATALENGTH 技巧。如果您确实选择走这条路,则需要确保您的第二个查询与第一个查询完全匹配——您的主键上可能需要一个 ORDER BY 子句以确保 SQL Server 不会't jack 与您在第一个和第二个查询之间返回的列的顺序。

      此外,您可能希望查看在同一个 ODBC Execute 调用中运行这两个查询。这将最大限度地减少到数据库的往返次数,并可能为您带来一些额外的性能。

      【讨论】:

        猜你喜欢
        • 2011-12-17
        • 1970-01-01
        • 2013-08-07
        • 2015-08-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多