在使用CRecordset::Open()时,函数的第2个参数是一个SQL语句,通过它可以实现简单的查询,如m_pSet->Open(AFX_DB_USE_DEFAULT_TYPE,"select * from student where sno='981636'",查询结果得到学号sno=981636的记录,这个学号是在SQL语句中确定的,也就是在执行前就定下来的,那么如果我需要查询的学生的学号是在程序执行时才确定的(比如由用户在一个编辑框中输入),也就是使得查询条件参数化,我该如何写这个SQL语句呢?
   我知道这个问题对有数据库编程经历的人来说很简单,但我刚接触,所以还是请大家帮帮忙回答我一下。
   另外,标准SQL语句不仅仅有查询纪录集的能力,它还可以作统计,作数据库等的创建,又丰富的函数,如max,count,sum等,这些在VC中都如何用呢?我想问的是细节,也就是如何写代码,比如,我想统计学生总人数,我知道标准SQL语句这样写:select count(distinct sno) from student,那么这个得到的结果(一个整数值,学生人数)返回在哪里呢?我的意思是如何一VC代码(一个整型变量)获得这个返回的值呢?
如果谁又简单的数据库例子代码(用ODBC连接,使用CDAtabase,CRecordset),实现如:查询,添加,删除,统计等简单功能,请发给我:[email protected],谢谢!

解决方案 »

  1.   

    1、CString sql;
    CString strNum;
    myEdit.GetWindowText(strNum);
    sql.Format("select * from student where sno='%s'", strNum);
    m_pSet->Open(AFX_DB_USE_DEFAULT_TYPE, sql);2、MFC提供的那些玩意不能直接处理如 count 等有返回值的SQL语句,可用ADO
    3、我讨厌VC
      

  2.   

    第一个问题,
    你的sql字符串先拼好,在将字符串变量当参数就可以了。
    第二个问题
    你查msdn的CRecordset。按查询的字段顺序取值,返回值是variant型。
      

  3.   

    1、在你的CRecordSet派生类中添加一变量,例如:CString sNo_Param;
    2、在构造函数中初始化改变量并设置参数个数,
    sNo_Param = _T("");
    m_nParam = 1;(此处只有一个参数)
    3、在DoFieldExchange()函数中添加以下几行:
    pFX->SetFieldType(CFieldExchange::param);
    RFX->Text(pFX, _T("[sno]", sNo_Param);
    4、使用:....
    pMyRecordSet->m_strFilter = "sno = ?";
    pMyRecordSet->sNo_Param = #在此处设置你想要查询的学号#
    if(pMyRecordSet->Open())
    {
    ....
      

  4.   

    to  ronbado():
      你能将“按查询的字段顺序取值,返回值是variant型。”说详细点吗?谢谢!