数据库编程笔录之四

来源:互联网 发布:mac os 切换输入法 编辑:程序博客网 时间:2024/05/01 12:06
本篇想说一下如何获取记录集中各种类型的数值。比如数据库中定义的是varchar类型等,我们获取数据时该怎么写呢?这里我提供一些宏定义,大家只要在stdafx.h或者其它需要使用这些宏的地方插入这些语句,就可以很轻松的获取数据库中的数据了。与数据库是何种类型没有关系。
#define CREATEINSTANCE(sp,riid) {HRESULT _hr=sp.CreateInstance(__uuidof(riid));if(FAILED(_hr)) _com_issue_error(_hr);}
这是创建数据库连接,command和记录集对象使用的。可以这样调用:
CREATEINSTANCE(m_piConnection,Connection);

#define RsITEM(rs,x) rs->Fields->Item[_variant_t(x)]->Value
#define RsITEM_BSTR(rs,x) (RsITEM(rs,x).vt == VT_NULL)?CString(""):RsITEM(rs,x).bstrVal
#define RsITEM_DOUBLE(rs,x) (RsITEM(rs,x).vt == VT_NULL)?0:RsITEM(rs,x).dblVal
#define RsITEM_LONG(rs,x) (RsITEM(rs,x).vt == VT_NULL)?0:RsITEM(rs,x).lVal
#define RsITEM_BYTE(rs,x) (RsITEM(rs,x).vt == VT_NULL)?0:RsITEM(rs,x).bVal
#define RsITEM_DATE(rs,x) (RsITEM(rs,x).vt == VT_NULL)?0:RsITEM(rs,x).date
#define RsITEM_BOOL(rs,x) (RsITEM(rs,x).vt == VT_NULL)?0:RsITEM(rs,x).boolVal
#define RsITEM_DECIMAL(rs,x) (RsITEM(rs,x).vt == VT_NULL)?0.0:RsITEM(rs,x)
以上宏就是获取数据库中字符串,double型,整数,日期,布尔和numeric等类型的数据。
调用例程如下:
                                sShipInfo.sMMSIID        =        RsITEM_BSTR(piRecordset,"MMSI_ID");
                                sShipInfo.sCallSign        =        RsITEM_BSTR(piRecordset,"CALL_SIGN");
                                sShipInfo.sShipName        =        RsITEM_BSTR(piRecordset,"NAME");
                                sShipInfo.fCOG                =        RsITEM_DECIMAL(piRecordset,"COG");
                                sShipInfo.fSOG                 =        RsITEM_DECIMAL(piRecordset,"SOG");
                                sShipInfo.wBreadth         =        RsITEM_LONG(piRecordset,"WIDTH");
                                sShipInfo.wLength          =        RsITEM_LONG(piRecordset,"LENGTH");
                                sShipInfo.latLong.dLatitude                = RsITEM_DECIMAL(piRecordset,"LAT");
                                sShipInfo.latLong.dLongitude        = RsITEM_DECIMAL(piRecordset,"LONG");
                                sShipInfo.reptTime = RsITEM_DATE(piRecordset,"REPT_TIME");
由于数据库调用并没有图例,所以没有图片可以贴出。