У меня есть вопрос, связанный с 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?