创建driver为oracle in OraHome92的数据源OracleTest,测试连接成功。
程序为:
 _ConnectionPtr m_sDPADOConnection;
 m_sDPADOConnection.CreateInstance("ADODB.Connection");
 _bstr_t bstrConnectString = L"Provider=OraOLEDB.Oracle;Persist Security Info=False;Data Source=OracleTest";
 _bstr_t bstrUserId = L"StockDB";
 _bstr_t bstrPassword= L"StockDB";
try 
{
hr = m_sDPADOConnection->Open(bstrConnectString, bstrUserId, bstrPassword, adModeUnknown);
}
catch (_com_error e) 
{
CString errormessage;
errormessage.Format("连接数据库失败!\r\n错误信息:%s",e.ErrorMessage());
AfxMessageBox(errormessage);///显示错误信息         }
运行后错误信息为“未指定的错误”。
Provider=MSDAORA 也尝试过,现象相同。
请问各位我是哪里写错了。怎么写是正确的?

解决方案 »

  1.   

    程序开头加上
    CoInitialize(NULL);
    AfxOleInit();
    现象相同。
      

  2.   

    _bstr_t bstrConnectString 写的不对吧,有用户名和密码要加进去哦
      

  3.   

    试试这里的连接串
    http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=5949
      

  4.   

    我用的连接串是这样
    Provider=OraOLEDB.Oracle;Data Source=OracleTest;User ID=StockDB; Password=StockDB
      

  5.   

    是不是Persist Security Info得问题
      

  6.   

    改为
     _bstr_t bstrConnectString = L"Provider=OraOLEDB.Oracle;Data Source=OracleTest;User Id=StockDB;Password=StockDB;";
      _bstr_t bstrUserId = L"";
     _bstr_t bstrPassword= L"";
    问题仍然存在.Persist Security Info = true 时问题相同,= yes或no 时错误变为"IDispatch error #3187";请问设置DSN时有什么需要修改的选项吗?我是把Data Source Name;TNS Service Name;User写上,下面的那些都没改。
      

  7.   

    我的oracle数据库装在本机,请问和这个有关吗?
      

  8.   

    我将Data Source=数据源名 改为 Data Source=oracle数据库名,就正确了。
    请问这是什么原因?那数据源还有什么用处?如果我想在客户端运行程序,应该怎么做?
    明天结贴给分。
      

  9.   

    不多说了。我贴代码,嘿嘿//------------------------------------------------------------
    // Á¬½ÓORACLEÊý¾Ý¿â·þÎñÆ÷º¯Êý, ·½Ê½£ºADO DB
    bool  CEx32Dlg::ConnectORAServer(CString DatabaseName, CString User, CString Password)
    {
    if((DatabaseName=="")||(User==""))
    {
    MessageBox("Á¬½ÓÊý¾Ý¿âµÄÊý¾Ý¿âÃû¡¢Óû§Ãû¾ù²»ÄÜΪ¿Õ£¬ÇëÖØÐÂÌîд","Á¬½ÓÊý¾Ý¿â",MB_OK+MB_ICONERROR);
    return FALSE;
    }

    ::CoInitialize(NULL);
    _variant_t vFieldValue;
    CString strFieldValue;

    CString strConn,strConnectionString;
    CString strUserName,strPassword,strServerName;

    UpdateData(TRUE);
    strConnectionString = "";
    strUserName = m_strUser;
    strPassword = m_strPassword;
    strServerName = m_strDatabase;

    strConn.Format("Provider=MSDAORA.1;"
    "User ID=%s;Password=%s;Data Source=%s;"
    "Persist Security Info=True",
    (LPCTSTR)strUserName,(LPCTSTR)strPassword,
    (LPCTSTR)strServerName); // µÚÒ»´ÎʹÓÃm_pCon֮ǰ±ØÐëÏȳõʼ»¯,·ñÔòm_pConΪ0
    m_pCon.CreateInstance("ADODB.Connection");
    m_pCon->PutCursorLocation(adUseClient);     
    m_pCon->ConnectionTimeout=20;      

    CConnectDlg *pDlg;
    pDlg = new CConnectDlg;
    pDlg->Create(IDD_CONNECTDLG);
    pDlg->ShowWindow(SW_SHOW);
    pDlg->UpdateWindow();

    try
    {
    m_pCon->Open((LPCTSTR)strConn,
    (LPCTSTR)strUserName,(LPCTSTR)strPassword,
    adConnectUnspecified);
    }
    catch(...)
    {
    pDlg->ShowWindow(SW_HIDE);
    delete pDlg;
    MessageBox("Á¬½ÓÊý¾Ý¿âʧ°Ü£¡\n\nÇëÈ·ÈÏ\n  1.ÍøÂçÊÇ·ñÁ¬Í¨ \n  2.Êý¾Ý¿âÃû¡¢Óû§ÃûºÍÃÜÂëÊÇ·ñÕýÈ·\n  3.±¾µØoracle¿Í»§¶ËÊÇ·ñÒѾ­°²×°²¢ÕýÈ·ÅäÖÃ","Á¬½ÓÊý¾Ý¿â",MB_OK+MB_ICONERROR);
    return FALSE;
    }

    pDlg->ShowWindow(SW_HIDE);
    delete pDlg;
    if(m_pCon->State)
    {
    return TRUE;
    }
    else
    {
    MessageBox("Á¬½ÓÊý¾Ý¿âʧ°Ü£¡","Á¬½ÓÊý¾Ý¿â",MB_OK+MB_ICONERROR);
    return FALSE;
    }
    }//---------------------------------------------------------------------------------
    // Á¬½Ó SQL SERVER Êý¾Ý¿â·þÎñÆ÷º¯Êý£¬·½Ê½: OLE DB
    bool  CEx32Dlg::ConnectSQLServer_OLEDB(CString DBAliasName, CString Catlog, CString User, CString Password)
    {
    _ConnectionPtr m_pConnection =NULL;
    HRESULT        hr;

    ///´´½¨Connection¶ÔÏó
    hr = m_pConnection.CreateInstance("ADODB.Connection"); //Á¬½ÓSQL ServerÊý¾Ý¿â
    if(SUCCEEDED(hr))
    {
    CString strConn;
    strConn = "Provider=SQLOLEDB.1;Persist Security Info=False"
           "; User ID=" + User +
      "; Password=" + Password +
      "; Initial Catalog="+ Catlog +
      "; Data Source=sql2000";
    try
    {
    hr = m_pConnection->Open(LPCTSTR(strConn),"","",adModeUnknown);
    }
    catch(...)
    {
    MessageBox("using oledb, Connect Failure!"); 
    return FALSE;
    }
        if(hr == 0)
    {
    MessageBox("using oledb, Connect SUCCESS!"); 
    return TRUE;
    }
    return FALSE;
    }
    return FALSE;
    }//---------------------------------------------------------------------------------
    // Á¬½Ó SQL SERVER Êý¾Ý¿â·þÎñÆ÷º¯Êý£¬·½Ê½: OLE DB
    BOOL CEx32Dlg::ConnectSQLServer_ODBC(CString DBAliasName, CString Catlog, CString User, CString Password)
    {
    // TODO: Add your control notification handler code here
    _ConnectionPtr m_pConnection =NULL;
    HRESULT        hr;

    // ´´½¨Connection¶ÔÏó
    CoInitialize(NULL);
    m_pConnection.CreateInstance(__uuidof(Connection));
    #ifdef _DEBUG
    if (m_pConnection == NULL)
    {
    AfxMessageBox("Connection ¶ÔÏó´´½¨Ê§°Ü! ÇëÈ·ÈÏÊÇ·ñ³õʼ»¯ÁËCOM»·¾³\r\n");
    }
    #endif
    ASSERT(m_pConnection != NULL);
    hr = m_pConnection.CreateInstance("ADODB.Connection");

    // Á¬½ÓSQL ServerÊý¾Ý¿â
    if(SUCCEEDED(hr))
    {
    CString strConn;
    strConn = "Driver={sql server};server=sql2000"
          ";database=" + Catlog +
      ";uid=" + User +
      ";pwd=" + Password + ";";

    try
    {
    m_pConnection->Open(LPCTSTR(strConn), "", "", adModeUnknown); 
    }
    catch(...)
    {
    MessageBox("Connect Failure!");
    return FALSE;
    } if(hr == 0)
    {
    MessageBox("Connect Success!");
    return TRUE;
    }
    return FALSE;
    }
    return FALSE;
    }
      

  10.   

    //------------------------------------------------------------
    // 连接ORACLE数据库服务器函数, 方式:ADO DB
    bool  CEx32Dlg::ConnectORAServer(CString DatabaseName, CString User, CString Password)
    {
    if((DatabaseName=="")||(User==""))
    {
    MessageBox("连接数据库的数据库名、用户名均不能为空,请重新填写","连接数据库",MB_OK+MB_ICONERROR);
    return FALSE;
    }

    ::CoInitialize(NULL);
    _variant_t vFieldValue;
    CString strFieldValue;

    CString strConn,strConnectionString;
    CString strUserName,strPassword,strServerName;

    UpdateData(TRUE);
    strConnectionString = "";
    strUserName = m_strUser;
    strPassword = m_strPassword;
    strServerName = m_strDatabase;

    strConn.Format("Provider=MSDAORA.1;"
    "User ID=%s;Password=%s;Data Source=%s;"
    "Persist Security Info=True",
    (LPCTSTR)strUserName,(LPCTSTR)strPassword,
    (LPCTSTR)strServerName); // 第一次使用m_pCon之前必须先初始化,否则m_pCon为0
    m_pCon.CreateInstance("ADODB.Connection");
    m_pCon->PutCursorLocation(adUseClient);     
    m_pCon->ConnectionTimeout=20;      

    CConnectDlg *pDlg;
    pDlg = new CConnectDlg;
    pDlg->Create(IDD_CONNECTDLG);
    pDlg->ShowWindow(SW_SHOW);
    pDlg->UpdateWindow();

    try
    {
    m_pCon->Open((LPCTSTR)strConn,
    (LPCTSTR)strUserName,(LPCTSTR)strPassword,
    adConnectUnspecified);
    }
    catch(...)
    {
    pDlg->ShowWindow(SW_HIDE);
    delete pDlg;
    MessageBox("连接数据库失败!\n\n请确认\n  1.网络是否连通 \n  2.数据库名、用户名和密码是否正确\n  3.本地oracle客户端是否已经安装并正确配置","连接数据库",MB_OK+MB_ICONERROR);
    return FALSE;
    }

    pDlg->ShowWindow(SW_HIDE);
    delete pDlg;
    if(m_pCon->State)
    {
    return TRUE;
    }
    else
    {
    MessageBox("连接数据库失败!","连接数据库",MB_OK+MB_ICONERROR);
    return FALSE;
    }
    }//---------------------------------------------------------------------------------
    // 连接 SQL SERVER 数据库服务器函数,方式: OLE DB
    bool  CEx32Dlg::ConnectSQLServer_OLEDB(CString DBAliasName, CString Catlog, CString User, CString Password)
    {
    _ConnectionPtr m_pConnection =NULL;
    HRESULT        hr;

    ///创建Connection对象
    hr = m_pConnection.CreateInstance("ADODB.Connection"); //连接SQL Server数据库
    if(SUCCEEDED(hr))
    {
    CString strConn;
    strConn = "Provider=SQLOLEDB.1;Persist Security Info=False"
           "; User ID=" + User +
      "; Password=" + Password +
      "; Initial Catalog="+ Catlog +
      "; Data Source=sql2000";
    try
    {
    hr = m_pConnection->Open(LPCTSTR(strConn),"","",adModeUnknown);
    }
    catch(...)
    {
    MessageBox("using oledb, Connect Failure!"); 
    return FALSE;
    }
        if(hr == 0)
    {
    MessageBox("using oledb, Connect SUCCESS!"); 
    return TRUE;
    }
    return FALSE;
    }
    return FALSE;
    }//---------------------------------------------------------------------------------
    // 连接 SQL SERVER 数据库服务器函数,方式: OLE DB
    BOOL CEx32Dlg::ConnectSQLServer_ODBC(CString DBAliasName, CString Catlog, CString User, CString Password)
    {
    // TODO: Add your control notification handler code here
    _ConnectionPtr m_pConnection =NULL;
    HRESULT        hr;

    // 创建Connection对象
    CoInitialize(NULL);
    m_pConnection.CreateInstance(__uuidof(Connection));
    #ifdef _DEBUG
    if (m_pConnection == NULL)
    {
    AfxMessageBox("Connection 对象创建失败! 请确认是否初始化了COM环境\r\n");
    }
    #endif
    ASSERT(m_pConnection != NULL);
    hr = m_pConnection.CreateInstance("ADODB.Connection");

    // 连接SQL Server数据库
    if(SUCCEEDED(hr))
    {
    CString strConn;
    strConn = "Driver={sql server};server=sql2000"
          ";database=" + Catlog +
      ";uid=" + User +
      ";pwd=" + Password + ";";

    try
    {
    m_pConnection->Open(LPCTSTR(strConn), "", "", adModeUnknown); 
    }
    catch(...)
    {
    MessageBox("Connect Failure!");
    return FALSE;
    } if(hr == 0)
    {
    MessageBox("Connect Success!");
    return TRUE;
    }
    return FALSE;
    }
    return FALSE;
    }