Как прочитать значение NULL в ADO - PullRequest
1 голос
/ 16 июля 2011

У меня есть вопрос, связанный с NULL values Я подключаюсь к SQL Server 2008 через ADO после код :

#include "stdafx.h"
#include <stdio.h>

#include <windows.h>
#include <ole2.h>
#include <oleauto.h>

#ifdef _MSC_VER
#import "c:\Archivos de programa\Archivos comunes\System\ado\msado15.dll" rename ("EOF","adoEOF") no_namespace
#else

#define V_INT(X)         V_UNION(X, intVal)
#define V_UINT(X)        V_UNION(X, uintVal)
#include "msado15.tlh"
#endif

#include <comutil.h>

struct InitOle
{
    InitOle()  { ::CoInitialize(NULL); }
    ~InitOle() { ::CoUninitialize();   }
} InitOle_tag;

//------------------ utility fns to simplify access to recordset fields
_bstr_t RsItem( _RecordsetPtr p, BSTR fldName )
{  // by field name
    return( p->Fields->Item[_variant_t(fldName)]->Value );
}
_bstr_t RsItem( _RecordsetPtr p, long nIdx )
{ // by field # (0 is first)
    return( p->Fields->Item[_variant_t(nIdx)]->Value );
}
//-------------------------------- The Program ----------------
int main()
{
    _RecordsetPtr spRs;
    HRESULT hr;
    _bstr_t sConn= "driver={sql server};SERVER=VIRTUALPC;Database=test;UID=sa; PWD=";
    _bstr_t sSQL= "SELECT att0 FROM [dbo].[mytable]";

    try
    {
        hr= spRs.CreateInstance( __uuidof(Recordset) );
        if FAILED(hr) printf("CreateInstance failed\n");

        hr= spRs->Open( sSQL, sConn, adOpenForwardOnly, adLockReadOnly, adCmdText );
        if FAILED(hr) printf("Open failed\n");

        while( !(spRs->adoEOF) ) {
            printf("%s\n",
                    (char*) RsItem( spRs, 0L )

            );
            spRs->MoveNext();
        }
        spRs->Close();
    } catch( _com_error &e) {
        printf("Error:%s\n",(char*)e.Description());
    }
    return 0;
}

столбец, который я читаю att0, похож на:

att0
----
477
113
466
527
NULL
NULL
NULL

После выполнения программы я получаю:

477
113
466
527
Error:(null)
Press any key to continue . . .

Мне бы хотелось, чтобы при обнаружении значения NULL программа отображала

    477
    113
    466
    527
    -1
    -1
    -1

Любая идеяКак это сделать?

Все это действительно отлично работает, но если в моей таблице (которая позволяет NULLS) я получаю сообщение об ошибке при чтении NUll

, основная проблема в разделе:

while( !(spRs->adoEOF) ) {
            printf("%s\n",
                    (char*) RsItem( spRs, 0L )

            );
            spRs->MoveNext();
        }
  • Еще один вопрос: почему у программы ошибка чтения NULL?

1 Ответ

1 голос
/ 16 июля 2011

Я уверен, что есть какой-то способ проверить наличие нулевых значений для объекта Recordset, но я не знаю, как это должно быть сделано в c ++. Но я знаю, как исправить это в запросе.

Измените ваш запрос на:

SELECT coalesce(att0, -1) as att0 FROM [dbo].[mytable]
...