SQLFetch возвращает SQL_NO_DATA_FOUND для существующего GUID - PullRequest
1 голос
/ 09 ноября 2011

Мой класс имеет такую ​​структуру:

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 );
    }
}

Теперь самое интересное.
Если я SQLFetch использую "WHERE CreatorName = 'pierref'", он работает нормально.
Если я использую SQLFetch с помощью «WHERE CommentID = '{BD678ADC-A1FC-48D7-AF93-35E7D917028B}'», он работает нормально.
Если я использую SQLFetch с помощью «WHERE GroupID = '{F126CA9D-5AEF-479E-9172-03DF5266E6E8}'», он завершится с ошибкой 100 (SQL_NO_DATA_FOUND)

Но значения, возвращаемые из выборки с CreatorName или CommentID, заполняют m_Data.GroupID с {F126CA9D-5AEF-479E-9172-03DF5266E6E8}. Сама база данных имеет правильное имя столбца (без невидимых пробелов до или после) и правильное значение. Кажется, все хорошо, и я почесал свою голову в течение 90 минут.

1 Ответ

2 голосов
/ 10 ноября 2011

Я посмотрел на все различия между полями и заметил, что поле GroupID не проиндексировано. Насколько я знаю, это не является обязательным условием для работы операторов SELECT, но я его проиндексировал, чтобы увидеть. К моему удивлению, теперь это работает!

Я не специалист по базам данных, поэтому я не понимаю, почему его нужно индексировать. Если кто-то может просветить меня, пожалуйста, сделайте.

...