我的班级有这样的结构:
struct CommentData
{
GUID CommentID;
GUID GroupID;
wchar_t CreatorName[50];
long CreationDate;
} m_Data;
我的构造函数执行以下绑定:
void CCommentRecordset::CCommentRecordset( HDBC DBCHandle )
{
SQLAllocHandle( SQL_HANDLE_STMT, DBCHandle, &m_StmtHandle );
static SQLLEN Len;
SQLBindCol( m_StmtHandle, 1, SQL_C_GUID, &m_Data.CommentID, sizeof(m_Data.CommentID), &Len );
SQLBindCol( m_StmtHandle, 2, SQL_C_GUID, &m_Data.GroupID, sizeof(m_Data.GroupID), &Len );
SQLBindCol( m_StmtHandle, 3, SQL_C_WCHAR, m_Data.CreatorName, sizeof(m_Data.CreatorName), &Len );
SQLBindCol( m_StmtHandle, 4, SQL_C_ULONG, &m_Data.CreationDate, 0, &Len );
}
我提取记录列表的功能如下所示:
void CCommentRecordset::GetList( CommentList& Buffer, const GUID& GroupID )
{
Buffer.clear();
LPOLESTR IDStr;
StringFromCLSID( GroupID, &IDStr );
wchar_t SQL[100];
// swprintf_s( SQL, _countof(SQL), L"SELECT * FROM Comment WHERE GroupID='%s'", IDStr );
// swprintf_s( SQL, _countof(SQL), L"SELECT * FROM Comment WHERE CreatorName='pierref'" );
// swprintf_s( SQL, _countof(SQL), L"SELECT * FROM Comment WHERE CommentID='{BD678ADC-A1FC-48D7-AF93-35E7D917028B}'" );
swprintf_s( SQL, _countof(SQL), L"SELECT * FROM Comment WHERE GroupID='{F126CA9D-5AEF-479E-9172-03DF5266E6E8}'" );
SQLRETURN Result = ::SQLExecDirect( m_StmtHandle, (SQLWCHAR*)SQL.c_str(), SQL_NTS );
if ( Result == SQL_SUCCESS )
{
Result = SQLFetch( m_StmtHandle );
while ( Result == SQL_SUCCESS || Result == SQL_SUCCESS_WITH_INFO )
{
Buffer.push_back( m_Data );
Return = SQLFetch( m_StmtHandle );
};
SQLCloseCursor( m_StmtHandle );
}
}
现在,有趣的部分。
如果我使用“WHERE CreatorName ='pierref'”进行SQLFetch,它可以正常工作
如果我使用“WHERE CommentID ='{BD678ADC-A1FC-48D7-AF93-35E7D917028B}'”进行SQLFetch,它可以正常工作。
如果我使用“WHERE GroupID ='{F126CA9D-5AEF-479E-9172-03DF5266E6E8}'”进行SQLFetch,则会失败并显示100(SQL_NO_DATA_FOUND)
但是,使用CreatorName或CommentID从提取返回的值确实用{F126CA9D-5AEF-479E-9172-03DF5266E6E8}填充m_Data.GroupID。数据库本身确实具有正确的列名(前后没有不可见的空格)和正确的值。一切似乎都很好,我一直在这个问题上抓了90分钟。
答案 0 :(得分:2)
我查看了字段之间的所有差异,并注意到GroupID字段未编入索引。据我所知,这不是SELECT语句工作的要求,但我将其编入索引只是为了看。令我惊讶的是,它现在有用了!
我不是数据库方面的专家,因此我无法理解为什么要将其编入索引。如果有人能够启发我,请做。