请教如何使用VC在客户端连接服务器端的ORACLE的表?谢谢!

解决方案 »

  1.   


    HRESULT hr;
    CDBPropSet dbinit(DBPROPSET_DBINIT); dbinit.AddProperty(DBPROP_AUTH_USERID, cntDlg.m_strName);
    dbinit.AddProperty(DBPROP_AUTH_PASSWORD, cntDlg.m_strPwd);
    dbinit.AddProperty(DBPROP_AUTH_PERSIST_SENSITIVE_AUTHINFO, false);
    dbinit.AddProperty(DBPROP_INIT_DATASOURCE, cntDlg.m_strServer);
    dbinit.AddProperty(DBPROP_INIT_LCID, (long)2052);
    dbinit.AddProperty(DBPROP_INIT_PROMPT, (short)4);
    dbinit.AddProperty(DBPROP_INIT_TIMEOUT, (long)60);
    dbinit.AddProperty(DBPROP_INIT_PROVIDERSTRING, OLESTR(""));
    try
    {
    if (m_nDbType == DB_TYPE_ORACLE)
    {

    hr = m_DataSource.Open(_T("OraOLEDB.Oracle.1"), &dbinit);//打开数据源
    }
    else
    {
    dbinit.AddProperty(DBPROP_INIT_CATALOG, cntDlg.m_strDatabase); //Oracle不要求
    hr = m_DataSource.Open(_T("SQLOLEDB.1"),&dbinit);//打开数据源
    }
    if (FAILED(hr))
    {
    throw;
    }
    //打开会话。
    hr = m_session.Open(m_DataSource);
    if(FAILED(hr))
    {
    m_DataSource.Close();
    throw;
    }
    }
    catch(...)
    {
    GetLastError(m_szLastErrorDesc);
    SetStatus(m_szLastErrorDesc);
    }
    next 
    CDBPropSet propset(DBPROPSET_ROWSET);//DBSCHEMA_PROCEDURES
    propset.AddProperty(DBPROP_IRowsetChange, true);
    propset.AddProperty(ORAPROP_PLSQLRSet, true);
    propset.AddProperty(DBPROP_CANSCROLLBACKWARDS, true);
    propset.AddProperty(DBPROP_CANFETCHBACKWARDS, true);
    propset.AddProperty(DBPROP_UPDATABILITY, DBPROPVAL_UP_INSERT | DBPROPVAL_UP_CHANGE | DBPROPVAL_UP_DELETE);

    CCommand<CManualAccessor> rs;
    HRESULT hr = rs.Open(m_session, pszSQL, &propset, NULL, DBGUID_DBSQL, FALSE);
    try
    {
    if (rs.GetColumnInfo(&ulColumns, &pColumnInfo, &pStrings) != S_OK)
    throw; struct MYBIND* pBind = new MYBIND[ulColumns];
    rs.CreateAccessor(ulColumns, &pBind[0], sizeof(MYBIND)*ulColumns);
    for (ULONG l=0; l<ulColumns; l++)
    rs.AddBindEntry(l+1, DBTYPE_STR, sizeof(TCHAR)*40, &pBind[l].szValue,
    NULL, &pBind[l].dwStatus);
    rs.Bind(); ULONG ulFields = rs.GetColumnCount(); DeleteAllColumns();
    for (int i = 1; i <= ulFields; i++)
    {
    m_ctrlList.InsertColumn(m_nColumnCount++, OLE2T(pColumnInfo[i-1].pwszName), LVCFMT_LEFT, 10*pColumnInfo[i-1].ulColumnSize);
    }
    Sleep(100);
    while(rs.MoveNext() == S_OK)
    {
    m_ctrlList.InsertItem(m_nItems++, _T(""));
    for (ULONG j=0; j< ulFields; j++)
    {
    if (pBind[j].dwStatus == DBSTATUS_S_ISNULL)
    {
    m_ctrlList.SetItemText(m_nItems - 1, j , _T("NULL"));
    }
    else
    {
    LPTSTR lpszString = pBind[j].szValue;
    m_ctrlList.SetItemText(m_nItems - 1, j , lpszString);
    }
    }
    }
    delete pBind;
    }
    catch(...)
    {
    GetLastError(m_szLastErrorDesc);
    SetStatus(m_szLastErrorDesc);
    rs.Close();
    return FALSE;
    }
      

  2.   

    如果使用ODBC,
    1.首先你的客户端机子要安装oracle客户端,
    2.改 oracle/ora81/NETWORK/ADMIN/tnsnames.ora
    加入
    MYDSN=
      (DESCRIPTION =NORA8
        (ADDRESS_LIST =
          (ADDRESS = (PROTOCOL = TCP)(HOST = 10.1.2.253;)(PORT = 这里填你的端口))
        )
        (CONNECT_DATA =
          (SID=Scott)
        )
      )
    3.然后在控制面板-〉管理工具->数据源中建立数据源
    4.CDatabase database;
    database.Open(("ODBC;DSN=;UID=Scott;PWD=tiger");CMySet m_set;
    m_set.pDatabase=&database;
    m_set.Open();
      

  3.   

    用microsoft 的adodatacontrol控件CString strCon;
    strCon = "Provider=OraOLEDB.Oracle.1;Password=tiger;Persist Security Info=True;User ID=scott;Data Source=orclserv";m_Adodc.SetConnectionString(strCon);
    orclserv 同楼上