延迟缓冲区的概念是否在ODBC之外的任何地方使用?

时间:2014-04-22 10:21:12

标签: c++ odbc deferred-buffer

在ODBC中,Deferred Buffers是一个概念,在函数调用中指定值后的某个时间使用该值。

作为我研究的一部分,我试图弄清楚,如果当前正在使用任何其他应用程序,其中延迟缓冲区在ODBC之外使用?

在这方面,我想向社会了解他们是否在其他方面遇到过类似情况。

1 个答案:

答案 0 :(得分:7)

这是ODBC的一个非常具体的实现细节。从石器时代开始,在20世纪90年代早期,像Windows 3.x这样的16位操作系统很常见。其中非常重视内存使用并避免存储重复非常重要。

因此,ODBC中的常见模式是应用程序分配表数据和查询所需的存储空间。你正在谈论的那些“延迟缓冲”。 SQLBindCol()允许ODBC驱动程序稍后将检索到的数据直接戳到应用程序分配的存储中。对于从应用程序流向dbase的数据,SQLBindParameter()执行相反的操作。

这是一个脆弱的计划,显然很糟糕的事情发生在应用程序过早释放缓冲区时。这就是现代32位和64位数据提供商不再这样做的原因。他们自己分配缓冲区,应用程序从/向它们复制数据。

作为适用于其他用法的“概念”,没有什么特别之处。许多api函数以这种方式工作,您将指针传递给缓冲区,然后api函数将数据复制到您传递的缓冲区中。关于ODBC的唯一特别之处在于缓冲区可以在单个api函数调用之外保持使用。这通常更好地处理“句柄”概念。换句话说,有一个api函数分配并返回一个不透明的数字来标识资源。然后应用程序调用其他api函数并将句柄传回。还有一个专用功能可以再次释放句柄。除了手柄泄漏的风险之外,减少意外事故。