如何使用MFC进行数据库查询

如何使用MFC进行数据库查询

                       -----gwb2006(转载请保留)

最近因为工作需要,使用MFC访问远程数据库, 遇到一点小麻烦,不过幸好经过努力解决了。呵呵,一点小经验拿出来和大家分享下,希望后来者不会那么麻烦。
首先,MFC通过ODBC访问数据库,主要使用两个类,一个是CDataBase,一个是CRecordset。第一个是用于建立数据库连接的,第二个是数据集,用来查询的。步骤如下:
1.实例化一个CDataBase对象,并建立连接
CDataBase database;
database.OpenEx( _T( "DSN=odbclink" ),CDatabase::noOdbcDialog);//odbclink为数据源名称
//判断一下是否正确打开
if(!database.IsOpen())
{
    _tprintf(_T"打开失败");
}
2.从CRecordset继承一个类
class  myRecorderSet :  public  CRecordset
{
public:
    myRecorderSet(CDatabase
*   pDatabase   =   NULL,CString   sSQlstatment = "DNS = test1",int nParam=2);
    
~myRecorderSet(){};
    
void   Move(   long   nrows,   WORD   wfetchtype   );   
    
void SetInputParam(CString sUserID);
    DECLARE_DYNAMIC(myRecorderSet)

    
int   m_retreturn_value;  
    CString   m_UserID;  
    CString   m_UserName;  
    CString   m_SqlStatment;

public:  
    
virtual   CString   GetDefaultConnect();         //   Default   connection   string  
    virtual   CString   GetDefaultSQL();         //   Default   SQL   for   Recordset  
    virtual   void   DoFieldExchange(CFieldExchange*   pFX);     //   RFX   support  

#ifdef   _DEBUG  
    
virtual   void   AssertValid()   const;  
    
virtual   void   Dump(CDumpContext&   dc)   const;  
#endif 
}
;
void  AFXAPI RFX_Textout(CFieldExchange  *  pfx, LPCTSTR szname, 
                            CString
&  value,  int  nmaxlength,  int  ncolumntype,  short  nscale);  
IMPLEMENT_DYNAMIC(myRecorderSet,CRecordset)  

myRecorderSet::myRecorderSet(CDatabase
*  pdb,CString Sqlstatment, int  nParam):CRecordset(pdb)  
{  
    m_UserID
="";  
    m_UserName
="";  
    m_nDefaultType 
= snapshot;  
    m_SqlStatment 
= Sqlstatment;
    m_nParams
=nParam;
}


CString myRecorderSet::GetDefaultConnect()  
{  
    
return _T(m_SqlStatment);
}
  

CString myRecorderSet::GetDefaultSQL()  
{  
    
return _T("");
}
  

void  myRecorderSet::DoFieldExchange(CFieldExchange *  pFX)  
{  
    pFX
->SetFieldType(CFieldExchange ::outputParam);        //set the field type to outputParam for the return value 
    RFX_Int(pFX, _T("@RETURN_VALUE"), m_retreturn_value);    //bind the return value to the variable 
    pFX->SetFieldType(CFieldExchange ::inputParam);            //reset the field type to inputParam 
    RFX_Text(pFX, "@issd", m_UserID);                    //,255,SQL_CHAR,0);     
    pFX->SetFieldType(CFieldExchange ::outputParam);
    RFX_Text(pFX, 
"@nsssame", m_UserName);                //bind the @m_UserName to the m_UseraName

}
  

/////  
//    myRecorderSet   diagnostics  

#ifdef _DEBUG 
void  myRecorderSet::AssertValid()  const  

    CRecordset::AssertValid(); 
}
 

void  myRecorderSet::Dump(CDumpContext &  dc)  const  

    CRecordset::Dump(dc); 
}
 
#endif  

void  myRecorderSet::Move( long  nrows, WORD wfetchtype) 

    
if (m_nFields) 
        CRecordset ::Move(nrows, wfetchtype); 
    
else 
        m_bBOF 
= m_bEOF = true
}
 
void  myRecorderSet::SetInputParam(CString sUserID)
{
    m_UserID
= sUserID;
}

未完待续......................
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值