开发环境:VC6.0+Oracle9i+ADO
设想:将数据库访问做成一个独立的动态库,所有访问者通过此动态库的输出函数与数据库交流
问题:由于没有在VC下做过数据库程序,有经验的朋友说一说
1、这样可以吗
2、如果不行,有没有其他好办法省却每次访问数据库的细节;如果可以,输出哪些函数,可以罗列一下函数声明
3、有相关代码麻烦贴些关键内容学习一下。谢谢!!

解决方案 »

  1.   

    BOOL CDlgDBConnect::ConnectOracle()
    {
    if (m_strService.IsEmpty())
    {
    ::MessageBox(NULL,"·þÎñÃû²»ÄÜΪ¿Õ","Ìáʾ",MB_OK);
    return FALSE;
    } theApp.m_pConnection.CreateInstance(__uuidof(Connection)); 
    try                 
    {
    //OLEDBÇý¶¯
    theApp.m_strDatabase=m_strService;
    CString strConn;
    strConn="Provider=OraOLEDB.Oracle.1;Password=";
    strConn+=m_strPassword;
    strConn+=";Persist Security Info=True;User ID=";
    strConn+=m_strUsername;
    // strConn+=";SERVER=";
    // strConn+=m_strService;
    strConn+=";Data Source=";
    strConn+= m_strService;
    theApp.m_pConnection->Open((_bstr_t)strConn,
       "",
       "",
       adModeUnknown);
    }
    catch(_com_error e)
    {
    ::MessageBox(NULL,e.Description(),"Ìáʾ",MB_OK);
    return FALSE;
    }

    ::MessageBox(NULL,"Êý¾Ý¿âÁ¬½Ó³É¹¦£¡","Ìáʾ",MB_OK);
    return TRUE;}
      

  2.   

    看看下面的几个对ADO的封装类
    http://www.codeproject.com/database/adowraps.asp
    http://www.codeproject.com/database/aadoclass.asp
    http://www.codeproject.com/database/caaadoclass1.asp
      

  3.   

    谢谢大家。
    syy64(太平洋)写的是连接数据库的函数,如果我想在写一个SelectSql()函数,用来执行SQL查询语句,应该返回什么呢?是不是还应该写个InsertSql(),DeleteSql(),CloseOracle(),IsConnectOracle()---是否已经连接数据库 IsCloseOracle()--是否已经断开数据库 函数呢? laiyiling(【CSDN●目标】)  提供的地址我去看看。
      

  4.   

    我的疑问是能返回记录集吗
    比如:动态库AdoConnOracle.dll输出一个查询函数SelectSql()
    我在程序中使用这个动态库的相关函数....省去动态连接相关语句...CString strSql = "SELECT id,name FROM user";//使用动态库函数连接数据库
    ConnectOrale();//如果连接执行查询
    if(isConnectOracle)
    {
      XXX = SelectSql(strSql);  //XXX应该是什么类型?函数SelectSql怎样能返回查询结果呢
    }//输出结果
    for(...)
    {
      输出...
    }//关闭数据库连接
    CloseOracle();谢谢大家!help!
      

  5.   

    经过摸索和整理,贴出步骤及代码如下:
    1、在stdafx.h中导入ado库,为了避免冲突,将EOF改名为EndOfFile
    #import "msado15.dll" no_namespace rename("EOF","adoEOF")
    2、创建新类COracleADO,生成文件OracleADO.h和OracleADO.cpp。
    3、定义两个成员变量
       // 连接对象
       _ConnectionPtr m_pConnection;

       // 是否已连接数据库
       BOOL m_bConnectedOracle;
    4、定义并实现相关连接、断开及执行SQL语句的成员函数// 判断是否与指定数据库建立了连接
    BOOL COracleADO::IsConnectedOracle()
    {
    if(TRUE == m_bConnectedOracle)
    {
    return TRUE;
    }
    else
    {
    return FALSE;
    }
    }// 根据指定参数连接数据库
    // datasource 数据源 userid 用户名 password 密码
    BOOL COracleADO::ConnectOracle(_bstr_t datasource, _bstr_t userid, _bstr_t password)
    {
    //初始化com环境
    ::CoInitialize(NULL); try
    {
    m_pConnection.CreateInstance(__uuidof(Connection)); _bstr_t strConnect="Provider=OraOLEDB.Oracle.1; ";
    strConnect += "Data Source=";
    strConnect += datasource;
    strConnect += ";User ID=";
    strConnect += userid;
    strConnect += ";Password=";
    strConnect += password;

    m_pConnection->Open(strConnect,"","",NULL);
    } catch(_com_error e)
    {
    AfxMessageBox(e.Description());
    return FALSE;
    } m_bConnectedOracle = TRUE;
    return TRUE;
    }// 断开与数据库的连接
    BOOL COracleADO::DisconnectOracle()
    {
    if(TRUE == IsConnectedOracle())
    {
    try
    {
    m_pConnection->Close();
    }
    catch(_com_error e)
    {
    AfxMessageBox(e.Description());
    return FALSE;
    } ::CoUninitialize();
    }

    return TRUE;
    }// 执行SQL语句,可以返回记录集
    _RecordsetPtr COracleADO::ExecuteOracle(_variant_t varSQL)
    {
    _RecordsetPtr pRec;
    pRec.CreateInstance(__uuidof(Recordset));
    pRec->Open(varSQL,
    m_pConnection.GetInterfacePtr(),
    adOpenDynamic,
    adLockOptimistic,
    adCmdText); return pRec;
    }
      

  6.   

    应用示例,查询出当前所有的表名并依次在对话框中显示:
       COracleADO oraConn;
       BOOL bOK = TRUE;
       if(FALSE == oraConn.IsConnectedOracle()) //尚未建立连接
       {
          bOK = oraConn.ConnectOracle("","sa","aa"); //连接数据库
       }
       if(TRUE == bOK) //已经建立了连接
       {
          _RecordsetPtr pRec;
          _variant_t vTname;
          try
          {
             pRec = oraConn.ExecuteOracle("SELECT TNAME FROM tab");
             while(!pRec->adoEOF)
             { 
      vTname = pRec->GetCollect("TNAME");
      if(vTname .vt!=VT_NULL)
      {
         AfxMessageBox(_bstr_t(vTname ));
      }
      pRec->MoveNext();
             } 

             pRec->Close();
          }
          catch (_com_error e)
          { 
             AfxMessageBox(e.Description());
          } 
          catch(...)
          { 
             AfxMessageBox("ADO发生错误!");
          }
      }