我正在尝试使用ODBC在使用Vertica 7.2.3时测试字段:ResultBufferSize。 根据我的理解,这个字段应该影响结果集。 ResultBufferSize
但即使价值为1,我也会得到20K的结果。
无论如何要让它发挥作用?
答案 0 :(得分:0)
ResultBufferSize是ODBC数据源中配置的结果缓冲区的大小。不是在运行时。 通过准备SQL语句 - SQLPrepare(),计算结果列 - SQLNumResultCols(),然后为每个找到的列运行SQLDescribe(),获得获取缓冲区的实际大小。 祝好运 - 马可
答案 1 :(得分:0)
我需要在你的评论中添加一个完整的答案,Tsahi。 不过,我不确定我是否还会误解你。 也许澄清我是如何在基于ODBC的SQL解释器中做到这一点的,可以解释这个问题。
对包含“SELECT * FROM foo”的字符串的SQLPrepare()返回SQL_SUCCESS,并且传递的语句句柄变为有效。
该语句句柄上的SQLNumResultCols(& stmt,& colcount)返回其第二个参数中的列数。
在从0到(colcount-1)的for循环中,我调用SQLDescribeCol()来获取列的大小 - 这是我必须分配给fetch的字节数该列可能出现的最大情况。
我分配了足够的内存,以便能够在后续的SQLFetchScroll()调用中获取一行行而不是一行。例如,10,000行的块。为此,我需要为colcount中的每列分配最大可能的可获取大小的10,000倍。另外还有一个两字节整数,用于每列的Null指示符。这两个:分配的数据区和分配的空指示符区,在我的示例中为10,000行,使得获取缓冲区大小,换句话说,结果缓冲区大小。
对于准备好的语句句柄,我调用SQLSetStmtAttr()将SQL_ATTR_ROW_ARRAY_SIZE设置为10,000行。
SQLFetchScroll()将在一次调用中返回10,000行,或者,如果表foo包含较少的行,则返回foo中的所有行。
这就是我理解它的工作原理。
你可以反过来做数学:
您设置了最大提取缓冲区。
您准备并描述了上述声明和列。
对于每一列,您为空指示符计算两个字节,从SQLDescribeCol()计算最大可能的提取大小,以获取需要分配的一行的字节总和。
您将最大获取缓冲区的整数除以一行的字节总和。
然后使用该整数除法结果调用SQLSetStmtAttr()来设置SQL_ATTR_ROW_ARRAY_SIZE。
希望它有道理......