• Visual C++ ODBC 参数化记录集查询设计


    ODBC通过RFX自动完成数据源和记录集对象之间的数据传输交换,而通过DDX对话框数据交换实现记录集数据和窗体控件的绑定。本文给出了一个通过GetDefaultSQL的方法设计了一个简单的查询,不过这儿的查询语句是设定好的,灵活性不高,各个条件之间是OR的关系,没法实现复杂的查询。

    在使用参数化记录集之前,需要先确定所需的参数。学习所用的数据表如下:

    image

    这儿将所有的字段都设置为参数,在记录集类定义参数,并初始化:

    // 参数定义
    long	m_stunum2;
    CStringW	m_name2;
    CStringW	m_gender2;
    long	m_age2;
    long	m_classnum2;
     
    // 构造函数中初始化
    m_stunum2 = 0;
    m_name2 = L"*";
    m_gender2 = L"*";
    m_age2 = 10;
    m_classnum2 =1;
    m_nParams=5;
    

    在DoFieldExchange中添加参数数据交换函数:

    void CdatatestSet::DoFieldExchange(CFieldExchange* pFX)
    {
    	pFX->SetFieldType(CFieldExchange::outputColumn);
    // Macros such as RFX_Text() and RFX_Int() are dependent on the
    // type of the member variable, not the type of the field in the database.
    // ODBC will try to automatically convert the column value to the requested type
    	RFX_Long(pFX, _T("[学号]"), m_stunum);
    	RFX_Text(pFX, _T("[姓名]"), m_name );
    	RFX_Text(pFX, _T("[性别]"), m_gender);
    	RFX_Long(pFX, _T("[年龄]"), m_age);
    	RFX_Long(pFX, _T("[班级编号]"), m_classnum);
    
    	pFX->SetFieldType(CFieldExchange::inputParam);
    	RFX_Long(pFX, _T("1”), m_stunum2);
    	RFX_Text(pFX, _T("2"), m_name2 );
    	RFX_Text(pFX, _T("3"), m_gender2);
    	RFX_Long(pFX, _T("4"), m_age2);
    	RFX_Long(pFX, _T("5"), m_classnum2);
    }

    设置查询条件的过滤字符串,串中的参数占位符(?)与上面绑定的顺序一致:

    CString CdatatestSet::GetDefaultSQL()
    {
    	m_strFilter=L"学号=? OR 姓名=? OR 性别=? OR 年龄=? OR 班级编号=?";
    	return _T("[学生信息表]");
    }

    最后在View类中设置数据交换,并编写相应的查询函数:

    void CdatatestView::DoDataExchange(CDataExchange* pDX)
    {
    	CRecordView::DoDataExchange(pDX);
    	// 可以在此处插入DDX_Field* 函数以将控件“连接”到数据库字段,例如
    	// DDX_FieldText(pDX, IDC_MYEDITBOX, m_pSet->m_szColumn1, m_pSet);
    	// DDX_FieldCheck(pDX, IDC_MYCHECKBOX, m_pSet->m_bColumn2, m_pSet);
    	// 有关更多信息,请参阅MSDN 和ODBC 示例
    	DDX_FieldText(pDX,IDC_EDIT1,m_pSet->m_stunum,m_pSet);
    	DDX_FieldText(pDX,IDC_EDIT2,m_pSet->m_name,m_pSet);
    	DDX_FieldText(pDX,IDC_EDIT3,m_pSet->m_gender,m_pSet);
    	DDX_FieldText(pDX,IDC_EDIT4,m_pSet->m_age,m_pSet);
    	DDX_FieldText(pDX,IDC_EDIT5,m_pSet->m_classnum,m_pSet);
    
    	//对话框数据交换
    	DDX_Text(pDX,IDC_EDIT6,m_stunum);
    	DDX_Text(pDX,IDC_EDIT7,m_name);
    	DDX_Text(pDX,IDC_EDIT8,m_sex);
    	DDX_Text(pDX,IDC_EDIT9,m_age);
    	DDX_Text(pDX,IDC_EDIT10,m_classnum);
    }
    
    
    void CdatatestView::OnMyQuery()
    {
    	UpdateData(TRUE);	
    	m_pSet->m_classnum2=m_classnum;
    	m_pSet->m_name2=m_name;
    	m_pSet->m_gender2=m_sex;
    	m_pSet->m_stunum2=m_stunum;
    	m_pSet->m_age2=m_age;
    	m_pSet->Requery();
    	UpdateData(FALSE);
    }
    

    最后的结果如下:

    image

  • 相关阅读:
    [OpenGL ES 071]光照原理
    [OpenGL ES 03]3D变换:模型,视图,投影与Viewport
    [日志]当今最流行的网络生僻字,很火
    [日志]关于茶的基础知识
    [健康]快速除牙痛的八个小验方
    [日志]我们生活中的潜规则
    [日志]做事要方,做人要圆
    [日志]家居装修花钱看你怎么省
    [日志]非常宝贵的工作经验
    [日志]你用的着的一些家装尺寸数据
  • 原文地址:https://www.cnblogs.com/feisky/p/1628122.html
Copyright © 2020-2023  润新知