最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 正文

vc++访问数据库

来源:动视网 责编:小OO 时间:2025-10-04 05:35:28
文档

vc++访问数据库

一、使用ADO连接数据源一般来说当建立基于对话框的应用程序时,都选择使用ADO比较方便(这纯属个人习惯问题)。1.直接在应用程序中建立与数据库的connection2.自己写一个ADOConnection类作为应用程序操作数据库的接口,这样操作的层次更明显,程序的分层思想也体现较好。下面分别就这两种方法做个总结。1.直接在应用程序中建立与数据库的connection在应用程序中要使用ADO,则需要引入ADO的动态连接库。其方法为:在StdAfx.h中:#import"c:\\programfi
推荐度:
导读一、使用ADO连接数据源一般来说当建立基于对话框的应用程序时,都选择使用ADO比较方便(这纯属个人习惯问题)。1.直接在应用程序中建立与数据库的connection2.自己写一个ADOConnection类作为应用程序操作数据库的接口,这样操作的层次更明显,程序的分层思想也体现较好。下面分别就这两种方法做个总结。1.直接在应用程序中建立与数据库的connection在应用程序中要使用ADO,则需要引入ADO的动态连接库。其方法为:在StdAfx.h中:#import"c:\\programfi
  一、使用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类来执行查询、删除、修改、添加操作。基本方法跟前面所提到的一致。

文档

vc++访问数据库

一、使用ADO连接数据源一般来说当建立基于对话框的应用程序时,都选择使用ADO比较方便(这纯属个人习惯问题)。1.直接在应用程序中建立与数据库的connection2.自己写一个ADOConnection类作为应用程序操作数据库的接口,这样操作的层次更明显,程序的分层思想也体现较好。下面分别就这两种方法做个总结。1.直接在应用程序中建立与数据库的connection在应用程序中要使用ADO,则需要引入ADO的动态连接库。其方法为:在StdAfx.h中:#import"c:\\programfi
推荐度:
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top