语句成功就是说函数序列错误??
void CLoginDlg::OnLogin() 
{
// TODO: Add your control notification handler code here

UpdateData(true);
m_pLoginSet->m_ParaId = m_id;
m_pLoginSet->m_ParaPassword = m_password;
m_strLogin = _T("{CALL add_admin(?, ?)}");
if (m_pLoginSet->IsOpen())
{
m_pLoginSet->Close();
}
m_pLoginSet->Open(CRecordset::dynaset ,  _T("{call login_administrator(?, ?,?)}"),false);

if (m_pLoginSet->m_ParaReturn!= 1)
{
MessageBox("用户名或密码不正确,请重新输入", "错误");
return;
}
else
{
CDialog::OnCancel();
}

解决方案 »

  1.   

    call login_administrator(?, ?,?) 一共有三个输入参数
    m_pLoginSet->m_ParaId = m_id;
    m_pLoginSet->m_ParaPassword = m_password;
    //你这里只付值两个
    怎么回事?
      

  2.   

    另一个是output参数,前两个是input
    output 就是m_pLoginSet->m_ParaReturn
      

  3.   

    贴出你的存储过程定义,重载CRecordset::DoFieldExchange的内容。
      

  4.   

    存储过程如下     
     PROC login_administrator
    @id char(20),
    @password char(10),
    @return int OUTPUT

    AS
    IF EXISTS(SELECT  * FROM administrator a WHERE 
    a.administrator_id = @id AND a.administrator_password = @password)
    BEGIN
     SET @return = 1

    END
    ELSE
    SET @return = 0
    重载函数
    void CLoginSet::DoFieldExchange(CFieldExchange* pFX)
    {
    //{{AFX_FIELD_MAP(CLoginSet)
    pFX->SetFieldType(CFieldExchange::outputColumn);
    RFX_Text(pFX, _T("[administrator_id]"), m_administrator_id);
    RFX_Text(pFX, _T("[administrator_password]"), m_administrator_password); pFX->SetFieldType(CFieldExchange::inputParam);
    RFX_Text(pFX, _T("@id"), m_ParaId);
    RFX_Text(pFX, _T("@password"), m_ParaPassword); pFX->SetFieldType(CFieldExchange::outputParam);
    RFX_Int(pFX, _T("@return"), m_ParaReturn);
    //}}AFX_FIELD_MAP
    }有没有文挡看啊
      

  5.   

    你这是怎么来的,你的存储过程只有三个参数啊:
    PROC login_administrator
    @id char(20),
    @password char(10),
    @return int OUTPUT

    AS
    //
    pFX->SetFieldType(CFieldExchange::outputColumn);
    RFX_Text(pFX, _T("[administrator_id]"), m_administrator_id);
    RFX_Text(pFX, _T("[administrator_password]"), m_administrator_password);只要这里就对了
    void CLoginSet::DoFieldExchange(CFieldExchange* pFX)
    {
    //{{AFX_FIELD_MAP(CLoginSet)
    pFX->SetFieldType(CFieldExchange::inputParam);
    RFX_Text(pFX, _T("@id"), m_ParaId);
    RFX_Text(pFX, _T("@password"), m_ParaPassword); pFX->SetFieldType(CFieldExchange::outputParam);
    RFX_Int(pFX, _T("@return"), m_ParaReturn);
    //}}AFX_FIELD_MAP
    }
      

  6.   

    对存储过程的绑定只能绑定这PROC login_administrator
    @id char(20),
    @password char(10),
    @return int OUTPUT

    AS
    存储过程开始时声明的输入、输出参数,你这里只有三个,不只绑定存储过程中的其他变量啊!!
      

  7.   

    另外,就照你的改了还是会出现 函数序列错误的对话框,不知道他到底指的什么意思
    ,本储存过程也没有返回行集啊,还能用crecordset啊???
    请大哥一一解答
      

  8.   

    我想你没有明白我的意思啊
    我的recordset类在没有与参数绑定前,就已经与列数据绑定了,后来加入参数绑定的!!
      

  9.   

    不一定要返回记录集的,只要有返回就行了。@return int OUTPUT 这个就是返回了。
    对于存储过程,要重新重载recordset,所以你这句话我是不懂是什么意思的'就已经与列数据绑定了,后来加入参数绑定的!!"
    void CLoginSet::DoFieldExchange(CFieldExchange* pFX)
    {
    //{{AFX_FIELD_MAP(CLoginSet)
    pFX->SetFieldType(CFieldExchange::inputParam);
    RFX_Text(pFX, _T("@id"), m_ParaId);
    RFX_Text(pFX, _T("@password"), m_ParaPassword); pFX->SetFieldType(CFieldExchange::outputParam);
    RFX_Int(pFX, _T("@return"), m_ParaReturn);
    //}}AFX_FIELD_MAP
    }以上的定义,就你的存储过程而言,是没有错的。
    出错的话,可能是这条语句出错,你先在sql server的查询分析器中执行看有没有错:
    SELECT  * FROM administrator a WHERE 
    a.administrator_id = @id AND a.administrator_password = @password
      

  10.   

    没有错误
    SELECT  * FROM administrator a WHERE 
    a.administrator_id = ‘kkk' AND a.administrator_password = '999'
    能够返回你的意思是不是对于存储过程,要建立一新的set类,但不能绑定表中的列,
    只能绑定存储过程的参数!
      

  11.   

    我又试了一下,改了
    set::set(CDatabase* pdb, CString id, CString pas)
    : CRecordset(pdb), m_id(id), m_pas(pas)
    {
    //{{AFX_FIELD_INIT(set) m_ret = 0;
    m_nParams = 3;
    //}}AFX_FIELD_INIT
    }
    CString set::GetDefaultConnect()
    {
    return _T("ODBC;DSN=film");
    }CString set::GetDefaultSQL()
    {
    return _T("{call login_administrator(?,?,?)}");
    }void set::DoFieldExchange(CFieldExchange* pFX)
    {
    //{{AFX_FIELD_MAP(set)
    pFX->SetFieldType(CFieldExchange::inputParam);
    RFX_Text(pFX, _T("@id"), m_id);
    RFX_Text(pFX, _T("@password"), m_pas);

    pFX->SetFieldType(CFieldExchange::outputParam);
    RFX_Int(pFX, _T("@return"), m_ret);

    //}}AFX_FIELD_MAP
    }
    在按扭中响应事件
    void CTestView::OnButton1() 
    {
    // TODO: Add your control notification handler code here
    UpdateData(true);
    set db(NULL,m_id, m_pas);

    if (db.IsOpen())
    {
    db.Close();
    }
    db.Open();
    if (db.m_ret == 1)
    {
    MessageBox("hello");
    }
    db.Close(); 
    }运行结果弹出对话框上书“在调用SQLFetchScroll/SQLExtendedFetch之前列没有绑定数据"
    不知为何,我都要疯了
      

  12.   

    可能你没有看清楚,我重载了move函数:
    void set::Move(long nrows, WORD wfetchtype)
    {
    if (m_nFields)
    CRecordset ::Move(nrows, wfetchtype);
    else
    m_bBOF = m_bEOF = true;
    }
      

  13.   

    这回肯定行了,我已在我的机子上运行通过。
    这重载crecordset 的方法调用存储过程只能返回一行结果。如果返回一个记录集的话不用重载crecordset
    这样用就行了,记住,只能使用CRecordset::forwardOnly 
    CRecordset rs(&db);
    rs.Open(CRecordset::forwardOnly ,"{call .....}")
      

  14.   

    非常感谢老大哥给我的关照,谢谢你能耐心的的给我解答问题!
    thanks
      

  15.   

    大哥,又有事麻烦你了请听下文
    大哥好,我想建立一个类vc界面,用了别人的  ccoolbar类  
    (地址:http://www.vckbase.com/document/viewdoc.asp?id=257)  
    ,从里面生成对象后  
    ,在一  对象上面加入treectrl对象,现在想响应treectrl控件的选取item动作  
    ,然后切换视图!可是我不知道怎么办了,在mainframe里响应了鼠标点击事件后  
    发现竟然没有用,5555555,希望那位大哥救救我,别看了,就是你-----看贴子的