c - 如何确定 SQLBindCol 的正确缓冲区大小

标签 c odbc buffer unixodbc

SQLBindCol 函数需要一个缓冲区长度(对于某些缓冲区类型,如字符串):

http://msdn.microsoft.com/en-us/library/ms710118(v=vs.85).aspx

SQLRETURN SQLBindCol(
      SQLHSTMT       StatementHandle,
      SQLUSMALLINT   ColumnNumber,
      SQLSMALLINT    TargetType,
      SQLPOINTER     TargetValuePtr,
      SQLLEN         BufferLength,
      SQLLEN *       StrLen_or_Ind);

我如何知道应该分配多少字节?

我唯一能想到的就是使用 SQLGetDescField 获取 SQL_DESC_LENGTH,但那时我必须执行查询两次。

最佳答案

事实证明我混淆了函数运行的顺序,正确的顺序是:

  1. SQLBindParameter
  2. SQLExecDirect
  3. SQLBindCol

对于SQLBindParameter(至少对于输入参数),在执行语句之前长度已经已知。

SQLExecDirect之后,您可以使用SQLNumResultColsSQLGetDescField函数来确定列数、它们的数据类型、长度等。

SQL92/CLI(调用级接口(interface))文档在附录 B.2 交互式查询 中有一个使用 SQLDescribeCol 获取长度的示例。

关于c - 如何确定 SQLBindCol 的正确缓冲区大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21204938/

相关文章:

c - 嵌套的 lua_CFunction 调用

c - 在c中使用ptrace从另一个进程读取一 block 内存

python - 更改 pyodbc 期望 libodbc.2.dylib 存在的位置(更改默认 odbc 文件位置)

c - C 中的简单缓冲区溢出

c - 当什么都不执行时,是否有可以使用的虚拟左值?

c - libxml2 中奇怪的 XPath 行为

C# 如何 "verify"新连接实际上从连接池中得到重用

ms-access - "General error Unable to open registry key Temporary (volatile) ..."来自 Access ODBC

iphone - 应用程序处于后台状态时 AVPlayer 处理缓冲区

c++ - 直接写入顶点缓冲区