我想问一下,用MFC联接ORACLE数据库你们有代码让我看看么?或者告诉我怎么联好。我联接上以后就没有反应了,我联接上数据库中的某个表后,在运行程序的时候(好象是在联接数据库,但是很慢、很慢)就是打不开,也不是死机,也出现不了程序界面,但是在任务管理器里还可以看见它。为什么?thanks!!

解决方案 »

  1.   

    我用的是ODBC,不过其它的也可以,最好不用向导生成。
      

  2.   

    1.MFC ODBC:
    CHAR    *szAttributes =
    "DSN=student\0DESCRIPTION=student\0"
    "SERVER=server name\0"
    "DATABASE=student\0";
    if (FALSE == SQLConfigDataSource(NULL,ODBC_CONFIG_DSN,"Oracle ODBC Driver\0",szAttributes))
    AfxMessageBox("配置系统数据源失败,请手动配置!");
    //logon the server
    if(dlg.DoModal()==IDOK)
    {
    szServer=dlg.m_strServer;
    szUser=dlg.m_strUser;
    szPwd=dlg.m_strPwd; CString strConnect;
    strConnect.Format("SERVER=%s;DSN=student;UID=%s;PWD=%s",szServer,szUser,szPwd);
    if(!m_DB.OpenEx(strConnect,CDatabase::useCursorLib|CDatabase::noOdbcDialog))
    {
    AfxMessageBox("无法登录!请确认服务器、用户名和密码正确!");
    return false;
    }
    }
    else
    exit(0);2.ADO _bstr_t source("Driver={Oracle Server};Data Source=student;");
    _bstr_t user("username");
    _bstr_t pwd("password");
    try{
    hr=m_connection.CreateInstance(_uuidof(Connection));
    if(SUCCEEDED(hr))
    hr=m_connection->Open(source,user,pwd,16);
    else
    MessageBox("Connection Error");
    if(SUCCEEDED(hr))
    hr=m_recordset.CreateInstance(_uuidof(Recordset));
    else
    MessageBox("Open Error");
    if(SUCCEEDED(hr))
    m_fConnected=TRUE;
    else
    m_fConnected=FALSE;
    }
    catch(_com_error &e)
    {
    MessageBox(e.ErrorMessage());
    m_fConnected=FALSE;
    }
    if(!m_fConnected)
    MessageBox("ADO数据源初始化失败");
    else
    {
    m_strSource=(const char*)source;
    AfxMessageBox(m_strSource);
    }
      

  3.   

    mfc odbc简单,ado比较方便且功能强大!
      

  4.   

    thanks!!还有,在导入数据库的时候有如下错误,
    E:\Oracle\ORADATA\repair>imp sjt/sjt file=0310sjt.dmpImport: Release 8.1.5.0.0 - Production on 星期二 3月 11 10:40(c) Copyright 1999 Oracle Corporation.  All rights reserved.
    已连接到:Oracle8i Release 8.1.5.0.0 - Production
    With the Java option
    PL/SQL Release 8.1.5.0.0 - ProductionIMP-00010: 不是有效的导出文件,标题检验失败
    IMP-00000: 未成功终止导入为什么??谢谢相告!!
      

  5.   

    你好!我如果用ODBC的话就会如此,但是如果我用OLE DB的话,有时候是好的,有时候不是好的,为什么?也就是说我用OLE DB的话可以看见数据库中的表,而且用向导的话也可以得到数据库表中的信息,那不是说明联接上了么?而ODBC呢,也可以看见数据库中的表,但是在执行程序的时候就一直处于打开数据库状态,不能显示出界面。谢谢你先!!
      

  6.   

    我用ADO连,没有问题。
    其中m_pMyDb是_ConnectionPtr类型,
    Datasource是CString类型,内容是:
    Provider=MSDAORA.1;Password=你的密码;User ID=你的用户名;Data Source=你的服务名;Persist Security Info=Truetry
    //检查数据库连接是否正常
    {
        m_pMyDb->ConnectionTimeout=10;
        if(m_pMyDb->State!=adStateClosed)
        {
    m_pMyDb->Close();
    m_pMyDb->Open((_bstr_t)Datasource,"","",-1);
        }
        else
        {
    m_pMyDb->Open((_bstr_t)app->Datasource,"","",-1);
        }
    }
    catch(...)
    {
        if(m_pMyDb->State==adStateClosed)
        {
    MessageBox("无法连接数据库,请重新设置");
    return;
        }
    }
      

  7.   

    我也有一个ODBC的问题,不知道发到哪?
    我是刚注册进来的,没有发帖按钮。
      

  8.   

    就用ODBC弄个数据源,然后用ADO连这个数据源不行吗?
      

  9.   

    用mfc odbc是可以的,不过的确是很慢!我自己做的是可以的!
      

  10.   

    不过ADO比较快,而且也灵活些。要想省事自然是ODBC了。
      

  11.   

    请看faq: VC下用ADO连接ORACLE数据库?
    http://expert.csdn.net/Expert/FAQ/FAQ_Index.asp?id=5949
      

  12.   

    我常用OLE DB,一直很好,可能是你 程序的问题,发了一个例子给你,请查收!
      

  13.   

    请看我这段联接问题是在Win NT40下正常联接,在Win 2000下,到了
    rc=SQLConnect(hdbc,server,SQL_NTS,uid,SQL_NTS,pwd,SQL_NTS);
    就出错了。
    UINT InitHdbc() //初始化数据库
    {
    if(SQLAllocEnv(&henv)!=SQL_SUCCESS)return FALSE;
    SQLAllocConnect(henv,&hdbc);
    // SQLSetConnectOption(hdbc, SQL_LOGIN_TIMEOUT, 5); 
    rc=SQLConnect(hdbc,server,SQL_NTS,uid,SQL_NTS,pwd,SQL_NTS);
    if(rc!=SQL_SUCCESS && rc!=SQL_SUCCESS_WITH_INFO)
    {
    if(hdbc != NULL) SQLFreeConnect(hdbc);
    if(henv != NULL) SQLFreeEnv(henv);

    AfxMessageBox("数据变量 hdbc 初始化失败!"); return FALSE;
    } rc=SQLAllocStmt(hdbc,&hstmt);
    if(rc!=SQL_SUCCESS && rc!=SQL_SUCCESS_WITH_INFO)
    {
    rc=SQLFreeStmt(hstmt,SQL_CLOSE);
    rc=SQLFreeStmt(hstmt,SQL_DROP);
    SQLFreeConnect(hdbc);
    SQLFreeEnv(henv);
    AfxMessageBox("数据变量 hstmt 初始化失败!"); return FALSE;
    }
    Trace_Program("数据库初始化完毕。"); return TRUE;
    }