ODBC:SQLDescribeCol 总是 return columnNameLength 为 0
ODBC: SQLDescribeCol always return columnNameLength of 0
出于某种原因,ODBC SQLDescribeCol()
总是 returns columnNameLength
of 0
,这搞砸了代码的逻辑。
运行 在 Windows Server 2012 和 SQLServer 2014 Developer 中。
知道为什么它总是返回 0
的 columnNameLength
吗?
两件事:
- ODBC 可能没有问题,但您使用的 ODBC 驱动程序有问题。可能是错误或 "features" 中的一个 "optional".
- 即使驱动程序 return 的长度为 0,
columnName
仍然包含以 null 结尾的字符串。不太了解 C#,但我敢打赌有一种方法可以从中创建字符串对象。或者您可以尝试自己找到空终止符。在任何情况下,由于您的外部 buffer
需要足够大以容纳支持的最大列名称,因此复制整个 columnName
缓冲区应该没问题。
话虽这么说,但我认为如果您将函数改进为 return 一个字符串对象,情况会好得多。更少的(指针)参数、有意义的 return 值和异常错误处理。不过只是一个建议。
这被证明是 x64 构建的问题,其中参数的大小编码不正确(应该是 SQLULEN 而不是 SQLUINTEGER)
https://github.com/szekerest/mapserver/commit/6eb767fcaecd03960940343f9acef2ce296caf70
出于某种原因,ODBC SQLDescribeCol()
总是 returns columnNameLength
of 0
,这搞砸了代码的逻辑。
运行 在 Windows Server 2012 和 SQLServer 2014 Developer 中。
知道为什么它总是返回 0
的 columnNameLength
吗?
两件事:
- ODBC 可能没有问题,但您使用的 ODBC 驱动程序有问题。可能是错误或 "features" 中的一个 "optional".
- 即使驱动程序 return 的长度为 0,
columnName
仍然包含以 null 结尾的字符串。不太了解 C#,但我敢打赌有一种方法可以从中创建字符串对象。或者您可以尝试自己找到空终止符。在任何情况下,由于您的外部buffer
需要足够大以容纳支持的最大列名称,因此复制整个columnName
缓冲区应该没问题。
话虽这么说,但我认为如果您将函数改进为 return 一个字符串对象,情况会好得多。更少的(指针)参数、有意义的 return 值和异常错误处理。不过只是一个建议。
这被证明是 x64 构建的问题,其中参数的大小编码不正确(应该是 SQLULEN 而不是 SQLUINTEGER)
https://github.com/szekerest/mapserver/commit/6eb767fcaecd03960940343f9acef2ce296caf70