我用MFC做了一个程序,现要加入对数据库的支持,我采用ODBC连接,用ORACLE数据库,直接加入了一个继承自CRecordSet的类来对数据库的一个表进行处理。
默认情况下在开始使用此继承自CRecordSet类的对象时,会弹出ORACLE登录对话框。
我现在需要在程序里处理哪个登录用户在使用此程序,即需要知道登录用户名,该怎么实现?  是在登录之前得到用户,还是在登录之后用其它方法得到当前正在使用的用户???
请各位大侠们指教,我对数据库是一窍不通。
请详细告诉我在继承自CRecordSet的类的哪个函数里添加些什么代码。谢谢!!!
解决之后另开贴送200分

解决方案 »

  1.   

    CString CMySet::GetDefaultConnect()
    {
    return _T("ODBC;DSN=MyDSN;UID=UserID;PWD=PASSWD");
    }
      

  2.   

    这种方法我用过,先自已定义一个对话框,将输入的用户和密码放到这,
    但是如果第一次没有正确界输入就会弹出ORACLE登陆界面
      

  3.   

    你可以在程序运行的时候让用户输入,也可以直接写在程序里。
    不过直接写在程序里,万一你服务器的用户名和密码改变了,你不好改。
    但有时候,你不想让用户每一次都输入用户名和密码。我是把他们存放在一个文件中,然后每次我程序一运行,就取出文件中存取的DSN,UID,PWD.然后
             CDatabase database;
    try
    {

    database.Open(strConnect);//strConnect就是读出来的"ODBC;DSN=MyDSN;UID=UserID;PWD=PASSWD";
    }
    catch (CDBException* e)
    {
    AfxMessageBox(e->m_strError); e->Delete();
    return FALSE;
    }
    然后复用database.
    CMyset rs(&database);
      

  4.   

    g_database.OpenEx("ODBC;DSN=MyDSN;UID=UserID;PWD=PASSWD",CDatabase::noOdbcDialog);
    //这样子打开失败就不会弹出登陆对话框
      

  5.   

    建议使用复用。
    CMyRecordset rs(&database);
    或CMyRecordset rs;
      rs.m_pDatabase=database;
    这时候打开的recordset是使用database建立的线程(后台Oracle),用户名和密码都和database.Open时用的一样。如果没用复用CMyRecordset rs;
    rs.Open();//这时候是依照CString CMySet::GetDefaultConnect()中的打开的,这时候Open一次就创建一个新进程。如果同时有很多的CRecordset打开,后台的进程太多,Oracle就会报错。
      

  6.   

    to 52001314(passenger) :
    谢了,不过我不想把用户和密码放在一个文件里,就用ORACLE定添加的用户,
    不知strConnect第一次不正确的话,这种方法会不会又弹出ORACLE登当对话框?
      

  7.   

    你文件里存放的DSN,UID,PWD必须正确。如果有必要的话,可以写一个配置程序,如果database.Open(...)成功,然后把DSN,UID,PWD存入文件。
      

  8.   

    to 52001314(passenger):
    我先试试,
      

  9.   

    你在客户端通过ODBC上Oralce必须有用户名和密码啊!如果strConnect不正确,Open失败,你怎么操作数据?
      

  10.   

    所以我要让用户再次输入用户和密码,而不是Open失败就弹出ORACLE登陆对话框
      

  11.   

    写一个登陆对话框,样子和Oracle的一样。然后
    UpdateData();
    if (!g_database.OpenEx("ODBC;DSN=MyDSN;UID=UserID;PWD=PASSWD",CDatabase::noOdbcDialog))
    return;......直到输入正确才向下继续运行程序。
      

  12.   

    写错了,应该是
             UpdateData();
    try
    {
    database.OpenEx(str,CDatabase::noOdbcDialog);
    }
    catch(CDBException *e)
    {
    AfxMessageBox(e->m_strError);
    e->Delete();
    return;
    }         .........
      

  13.   

    to 52001314(passenger):
    我用了下面的语句:
    CMyRecordset rs;
    rs.m_pDatabase=database;//此处错误如下:
    /*error C2679: binary '=' : no operator defined which takes a right-hand operand of type 'class CDatabase' (or there is no acceptable conversion)  */
    难道CDatabase类没有“=”操作???
      

  14.   

    CMyRecordset rs;
    rs.m_pDatabase=database;//不能赋值
    要用rs.m_pDatabase = &database
    应用赋值
      

  15.   

    恩,打漏了&。rs.m_pDatabase = &database
      

  16.   

    CDatabase database;
    CString strConnect;
    CLoginDlg* dlg = new CLoginDlg;
    if (dlg->DoModal()== IDOK)
      {
    strConnect = "ODBC;DSN=pdms;UID=" + dlg->m_name + ";pwd=" + dlg->m_password;
        try
        {
          database.Open(strConnect,CDatabase::noOdbcDialog);
        }
       catch (CDBException* e)
       {
          AfxMessageBox(e->m_strError);
          e->Delete();
       }
    }
    当strConnect没有正确输入时,又弹出ORACLE登录对话框,这又怎么办呢??
      

  17.   

    在CLoginDlg的OnOK函数中
    void CLoginDlg::OnOK()
    {
       UpdateData();
    strConnect = "ODBC;DSN=pdms;UID=" + dlg->m_name + ";pwd=" + dlg->m_password;
        try
        {
          database.OpenEx(strConnect,CDatabase::noOdbcDialog);
        }
       catch (CDBException* e)
       {
          AfxMessageBox(e->m_strError);
          e->Delete();
          return;
       }
    }然后你刚才主程序的地方只要
    CLoginDlg* dlg = new CLoginDlg;
    if (dlg.DoModal()==IDCANCEL)
       return;就行了会弹出吗?你要用database.OpenEx(str,CDatabase::noOdbcDialog);
    是OpenEx,不是Open.m_database.OpenEx(str,CDafdftabase::noOdbcDialog);df
      

  18.   

    ft CSDN,退格键怎么经常不能用。上面最后一行是要用OpenEx,而不是Open.后面是贴错了。但是突然无法编辑了;(已经打那么长了,舍不得从头打。
      

  19.   

    ft CSDN,退格键怎么经常不能用。上面最后一行是要用OpenEx,而不是Open.后面是贴错了。但是突然无法编辑了;(已经打那么长了,舍不得从头打。
      

  20.   

    如果是没有使用参数的,
    CDatabase database;
    database.ExecuteSQL("begin myprocedure;end");就行了。这个问题你可以搜索以前的帖子,以前的有详细的解答。或者开个新贴问。
      

  21.   

    http://expert.csdn.net/Expert/topic/1173/1173605.xml?temp=.3136255
      

  22.   

    CrecordSet 内部的CDatabase可以返回当前连接子
    其中就含有用户名一项,在字符串中解析出来就可以了