64 位迁移问题:指针更改



我正在使用Ernesto Guisado为Microsoft的ODBC API使用的轻量级C++包装器,虽然无法从DDJ下载源文件,但我设法在github上找到了一个副本。

我可以在 win32 中使用当前代码进行编译,但在 x64 中编译会遇到错误

error C2664: 'SQLRETURN SQLDescribeCol(SQLHSTMT,SQLUSMALLINT,SQLCHAR *,SQLSMALLINT,SQLSMALLINT *,SQLSMALLINT *,SQLULEN *,SQLSMALLINT *,SQLSMALLINT *)' : 
cannot convert argument 7 from 'ULONG *' to 'SQLULEN *'

,基本上不能分配一个ULONG *(ULONG是32位(,给SQLULEN *(SQLULEN是64位(。

我该怎么做才能从 ULONG 顺利升级,以便拥有 64 位版本?

代码期望一个类型等效于另一个可能不同的类型,这是一种不好的做法。

为了保持类接口完整,您应该将函数更改为如下所示的内容:

void SqlStatement::DescribeCol(USHORT number, UCHAR *name,
       USHORT BufferLength, SHORT *NameLength,
       SHORT *DataType, ULONG *ColumnSize,
       SHORT *DecimalDigits, SHORT *Nullable)
{
    SQLULEN tmpColumnSize; // store column size before converting to ULONG
    assert(IsValid());
    CheckStatus(::SQLDescribeCol(m_hstmt, number, name,
       BufferLength, NameLength,
       DataType, &tmpColumnSize,
       DecimalDigits, Nullable));
    if(ColumnSize) *ColumnSize = (ULONG)tmpColumnSize;
}

如果类接口无关紧要,也可以在函数中用 SQLULEN 替换 ULONG。