视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
vc++访问数据库
2025-10-04 05:35:28 责编:小OO
文档
  一、使用ADO连接数据源 

  一般来说当建立基于对话框的应用程序时,都选择使用ADO比较方便(这纯属个人习惯问题)。

  1.直接在应用程序中建立与数据库的connection 

  2.自己写一个ADOConnection类作为应用程序操作数据库的接口,这样操作的层次更明显,程序的分层思想也体现较好。 

  下面分别就这两种方法做个总结。 

  1.直接在应用程序中建立与数据库的connection 

  在应用程序中要使用ADO,则需要引入ADO的动态连接库。其方法为: 

在StdAfx.h中:

   #import "c:\\program files\\common files\\system\\ado\\msado15.dll"\\ 

    no_namespace\\ 

    rename("EOF

  目的:产生msado15.tlh和msado15.tli两个头文件来定义ADO库。 

    定义好ADO库后,应初始化COM库环境。其方法为: 

  在C***APP::InitInstance中定义_ConnectionPtr m_pConnection; 

    AfxOleInit();//使用AfxOleInit初始化OLE/COM库环境 

  //创建ADO连接 

    m_pConnection.CreateInstance(_uuidof(Connection)); 

    //在ADO操作中使用try...catch捕获错误 

    try 

    {      m_pConnection->Open("provider=SQLOLEDB;server=ZENGYH;database=postms;uid=sa;pwd=hongyi

    } 

    catch (_com_error e) 

    { 

       AfxMessageBox("连接数据库失败!"); 

       return FALSE; 

    } 

  而相应的释放数据库的连接: 

在C***APP:: ExitInstance中: 

m_pConnection->Close();

    ::OleUninitialize(); 

  至此,关于数据库的连接与断开就能顺利实现,接下来将是对数据库中表的操作,即对记录集操作。 当操作数据库的表时,需先声明数据集指针:_RecordsetPtr m_pRecordset; 与创建ADO连接类似,需要在所操作的对话框类的OnInitDialog()中创建记录集对象: 

m_pRecordset.CreateInstance(_uuidof(Recordset)); 

    如此之后将可以使用m_pRecordset来查询,修改,删除数据库等。 

打开要操作的表可使用m_pRecordset的open函数m_pRecordset->Open("select * from STUDENTS",theApp.m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);

GetInterfacePtr是得到COM对象的实例指针

  记录集的查询操作: 

  使用可以使用如下的函数来实现记录集的移动MoveFirst, MoveNext , MovePrev,MoveLast。 

  提取列属性:GetCollect(“列名”),注意:此处的返回值类型为:_variant_t,这个类型类包含了许多与c++所支持的类型的转换函数,较常用的是与cstring类型的转换(LPCSTR)_bstr_t(_variant_t类型变量)。 

  记录集的增加操作: 

  确保要操作的记录集打开之后,首先调用m_pRecordset->AddNew(),AddNew之后将自动生成一个供记录集域值使用的新的空记录,来存放即将增加的数据信息,系统将自动执行sql的insert语句来插入记录。 

  然后通过设置列属性:PutCollect(“列名”,_variant_t &pvar)来设置记录信息 

  设置之后一定要调用m_pRecordset->Update()来更新记录集 

  记录集的修改操作: 

  修改操作与增加操作类似,唯一不同之处在于不用先调用AddNew,而直接将记录集指针移动到需要修改的记录处,执行PutCollect操作。 

  之后再Update。 

  记录集的删除操作: 

  当找到需要删除的记录时,利用m_pRecordset->Delete(adAffectCurrent);可以删除当前的记录。 再Update即可。 

  当然,在每次需要对记录集操作之前应当打开需要操作的表的记录集,操作完毕应关闭相应记录集,这样可以保证只声明一个记录集指针,每次只操作一个记录集,可以节约资源。 

  另外,在修改和删除操作中也可能需要查询满足条件的记录,可以这样实现: 

str.Format("select * from STUDENTS where StuID='%s'",m_StuID);      m_pRecordset->Open(str.AllocSysString(),theApp.m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);

  2.自己写一个ADOConnection类作为应用程序操作数据库的接口 

  通过自定义的ADOConnection类封装与应用程序操作数据库的接口(在这个类中应首先声明_ConnectionPtr 和_RecordsetPtr指针),这个类中要实现的功能包括:定义ADO库,初始化与ADO的连接,释放连接,初始化记录集(方法1的初始化是在相应类的OnInitDialog()中实现),执行SQL语句 

  定义ADO库,初始化与ADO的连接,释放连接与方法1一致; 

  初始化记录集: 

_RecordsetPtr & CAdoConnection::GetRecordset(_bstr_t mySql) 

    try 

    { 

       if (m_pConnection==NULL) 

       { 

           OnInitAdoConneciton(); 

       } 

       m_pRecordset.CreateInstance(_uuidof(Recordset)); 

       m_pRecordset->Open(mySql,m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);

    } 

    catch (_com_error *e) 

    { 

       AfxMessageBox(e->ErrorMessage());

    } 

    return m_pRecordset; 

  执行SQL语句主要使用connection来实现(不同于方法1利用记录集来实现) 

bool CAdoConnection::ExecuteSql(_bstr_t mySql) 

{ m_pConnection->Execute(mySql,NULL,adCmdText);}

  至此,在应用程序中可以通过定义这个ADOConnection的实例来完成相应的操作。 

  查询操作: 

  首先定义ADOConnection,执行初始化ADO连接; 根据查询条件取得记录集指针: 

_bstr_t mySql="select * from COURSES where CouID='"+m_CouID+"'"; 

_RecordsetPtr myRecordset=myConnection.GetRecordset(mySql); 

  根据指针的返回情况进行处理。 

  添加操作: 

  首先根据实际情况判断所要添加的记录是否存在(类似查询); 若返回的指针是为空,则说明要添加的记录不存在,则可以执行insert: 

mySql="insert into COURSES values('"+m_CouID+"','"+m_CouName+"',"+CouScore+

myConnection.ExecuteSql(mySql); 

  修改操作、删除操作: 

  与添加操作类似,执行update和delete语句 

  说明:每个函数中的初始化ADOConnection和释放应相对应。 

    与方法1相比,不需要单条操作记录集,记录集指针也可以声明多个,执行sql语句更方便。 

  记录集的初始化可以通用到ADOConnection类中,而无需方法1中在不同的类中初始化各自的记录集。 

  二、使用ODBC连接数据源 

  一般来说建立基于文档视图的应用程序时,使用此方法连接数据源。 

  1.使用CDatabase类中的executesql执行SQL语句 

  当创建基于单文档的应用程序时,若在第二步选择database view with file support,则需要配置ODBC数据源(如student表),并且生成的应用程序的基类为recordview。那么生成的应用程序的Doc类中将自动生成所绑定的数据集类(cstudentset m_studentset),View类中将自动生成(cstudentset *m_pset)。 

  连接数据库: 

  对数据库的连接要重载BOOL CStudentDoc::OnNewDocument(): 

  在该函数中加入这样的代码(m_database是我在文档类中定义的成员变量CDatabase): 

if(m_pStudentSet==NULL) 

    { 

       m_pStudentSet=new CStudentSet(&m_database); 

       CString strConnect=m_pStudentSet->GetDefaultConnect();

       m_database.Open(NULL,false,false,strConnect,false); 

    } 

  这里m_pStudentSet是在该文档类中重新定义的一个CStudentSet记录集指针,至此可以建立应用程序与数据库的连接。 添加记录操作: 

  在相应函数中声明CDatabase m_database 

  在函数中定义CStudentSet mySet(&m_database); 

  再打开记录集myset.open(); 

mySet.AddNew(); 

    CString mySql; 

    mySql="insert into STUDENTS(StuID,StuName) values('"+m_pSet->m_StuID+"','"+m_pSet->m_StuName+"')";

    m_database.ExecuteSQL(mySql); 

    mySet.Update(); 

  删除记录、修改记录操作: 

  在函数中定义CStudentSet mySet(&m_database); 

  再打开记录集myset.open(); 

mySet.Edit(); 

mysql=……. 

m_database.ExecuteSQL(mySql); 

mySet.Update(); 

  查询记录操作: 

  仍然可以选用记录集指针的移动,getcollect来实现。 

  最后,不要忘记myset.close()。 

  当然也可以使用CRecordset类来执行查询、删除、修改、添加操作。基本方法跟前面所提到的一致。下载本文

显示全文
专题