Не могу привести SQLINTEGER * к SQLLEN * (x64) - PullRequest
2 голосов
/ 26 февраля 2012

Я вызываю SQLGetData (), чтобы получить значение поля. Это прекрасно работает как 32-разрядное приложение, но оно уничтожает стек как 64-разрядное.

Странно то, что SQLLEN # определен как SQLINTEGER, поэтому они одно и то же. Оказывается, они оба длинные типы.

unsigned long Field::asUnsignedLong() const
{
unsigned long result;
SQLINTEGER sizeNeeded = 0;

    // Trashes the stack around sizeNeeded...
    if(!SQL_SUCCEEDED(SQLGetData(_statement, _columnIndex, SQL_C_ULONG, &result, sizeof(result), &sizeNeeded)))
    {
        throw std::runtime_error(getError(SQL_HANDLE_STMT, _statement));
    }

    return result;
}

Почему Visual Studio не может конвертировать SQLLEN * в SQLINTEGER *? И когда я принудительно использую явное приведение, почему стек поврежден?

Спасибо за любую помощь!

1 Ответ

3 голосов
/ 26 февраля 2012

В typedef есть , изменено в 64-битном API. Вот что вызывает повреждение вашего стека:

#ifdef _WIN64
typedef INT64 SQLLEN;
typedef UINT64 SQLULEN;
#else
#define SQLLEN SQLINTEGER
#define SQLULEN SQLUINTEGER
#endif

Вы передаете 32-разрядное целое число (SQLINTEGER равно typedef от d до long), когда оно ожидает 64-разрядное.

...