CRecordset::GetFieldValue() with BIGINT
CRecordset::GetFieldValue() with BIGINT
谁能帮我弄清楚如何从CRecordset
中读取__int64
值?
我的代码看起来像这样:
CDBVariant var;
CRecordset rs(&db);
rs.Open(CRecordset::forwardOnly, L"SELECT col FROM Customers");
rs.GetFieldValue((short)0, m_Var, SQL_C_SBIGINT);
但是调用GetFieldValue()
会产生错误:
参数值无效
跟踪代码,我看到CRecordset::GetDataBuffer()
断言,因为SQL_C_SBIGINT
(或就此而言SQL_C_BIGINT
(不是 switch 语句中的字段类型之一。
在花了一个多小时之后,我发现很多文档表明这应该是可能的,尽管没有一个示例。有谁知道是否可以做到?
好吧,我找不到CRecordset
的好方法.
由于CRecordset
是 Windows ODBC 函数的包装器,我发现我能够通过向下访问较低级别的函数来使其工作。下面的方法是派生自CRecordset
的类的一部分。
__int64 CRecordsetEx::GetInt64FieldValue(int nField)
{
__int64 val = 0;
GetData(nField, SQL_C_SBIGINT, &val, sizeof(val));
return val;
}
long CRecordsetEx::GetData(int nField, short type, LPVOID pBuffer, int nBufferSize)
{
SQLINTEGER nActualLength;
SQLRETURN r = ::SQLGetData(m_hstmt, (short)nField + 1, type, pBuffer, nBufferSize, &nActualLength);
if (r != SQL_SUCCESS && r != SQL_SUCCESS_WITH_INFO)
{
ASSERT(FALSE);
TCHAR szBuffer[10];
TCHAR szMessage[100];
SQLINTEGER nError;
if (::SQLGetDiagRec(SQL_HANDLE_STMT, m_hstmt, 1, szBuffer, &nError, szMessage, 100, NULL) == SQL_SUCCESS)
::AfxThrowDBException(r, m_pDatabase, m_hstmt);
}
// Note: nActualLength set to SQL_NULL_DATA if field was NULL
return nActualLength;
}
实际上,查看CRecordset
的代码,我认为这种方法更快一些,因此我为所有支持的数据类型实现了此方法,并且似乎运行良好。
相关文章:
- Problems with std::cin.fail()
- 应用程序崩溃并显示"symbol _ZdlPvm, version Qt_5 not defined in file libQt5Core.so.5 with link time reference"
- 这对"With a stackless coroutine, only the top-level routine may be suspended."意味着什么
- Boost.TEST with CLion: "Test framework quit unexpectedly"
- 避免碎片化的ClientHellos with OpenSSL (DTLS)
- Issues with Win32 ReadProcessMemory API
- Qt with WinAPI MouseProc
- [[maybe_unused]] with structured_binding?
- Issue with WriteProcessMemory
- OpenCV RTP-Stream with FFMPEG
- "Unable to start debugging. No process is associated with this object." - 在Visual Studio Code中使用GDB
- std::adjacent_difference with std::chrono time_point
- DLL Made with CMake 使程序崩溃
- QtCreator with C 库中的链接器问题
- SHBrowseForFolder with BIF_BROWSEFORCOMPUTER and SHGetPathFr
- specialized std::default_delete with QQmlComponent
- VS2019 - Sudo Remote Debugging on Linux with Cmake project
- Inference pytorch C++ with alexnet and cv::imread image
- CRecordset::GetFieldValue() with BIGINT
- Get bigint from Microsoft SQL Server with SOCI