MFC ADO数据库操作 - 延陵小明 - CSDN博客 http://blog.csdn.net/guoming0000/article/details/7280070/

内容比较乱,作为草稿,对现有的ado数据库操作函数方法进行汇总。

小函数
m_pRecordset->RecordCount//取得记录数量

全局变量
#import "msado15.dll" no_namespace rename("EOF","adoEOF")rename("BOF","adoBOF") 
_ConnectionPtr m_pConnection;
_RecordsetPtr m_pRecordset;

1.连接数据源OnInitADOConn();
//初始化OLE/COM库环境
::CoInitialize(NULL);
try{
//创建Connection对象
m_pCOnnection.CreateInstance("ADODB.Connection");
//设置连接字符串
_bstr_t strConnect="uid=;pwd=;DRIVER={Microsoft Access Driver(*mdb)};DBQ=database.mdb;";
m_pConnection->Open(strConnect,"","",adModeUnknown);
}
catch(_com_error e){
AfxMessageBox(e.Description);
}

2.关闭数据库连接
if(m_pRecordset!=NULL)
 m_pRecordset->Close();
m_pConnection->Close();
::CoUninitialize();//释放环境

3.获取记录集数据
传入一个_bstr_t bstrSQL
(1)Open方法
try{
if(m_pConnection==NULL)//如果为空,重新连接
 OnInitADOConn();
m_pRecordset.CreateInstance(__uuidof(Recordset));
m_pRecordset->Open(bstrSQL,m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
}//adCmdText:bstrSQL是文本.adCmdTable:bstrSQL是表名
(2)Execute方法
_RecordsetPtr Execute(_bstr_t CommandTex,VARIANT* RecordsAffeced,long Options)
CommandText是SQL命令,RecordsAffeced是操作后影响的行数,Options是CommandText中内容的类型
Options:adCmdText文本,adCmdTable表名,adCmdStoredProc存储过程,adCmdUnknown类型未知
>>_variant_t RecordsAffected;
try{
if(m_pConnection==NULL)//是否连接数据库
 OnInitADOConn();//又重新连接
 m_pConnection->Execute(bstrSQL,NULL,adCmdText);
}
catch(_com_error e)
{
e.Description();
return false;
}

4.遍历记录集
MoveNext,MoveFirst,MoveLast,MovePrevious;
(char *)(_bstr_t)m_pRecordset->GetCollect("姓名");//方法一
m_sName=(CStringW)(m_pAdoRecordset->Fields->Item[_variant_t("NAME")]->Value);//方法二
while(m_pRecordset->adoEOF==0)
{m_pRecordset->MoveNext();}

5.添加数据
try{
m_pRecordset->AddNew();//开始添加
m_pRecordset->PutCollect("列名",(_bstr_t)m_id);
m_pRecordset-->Update();//更新字段
}

6.修改数据
try{
m_pRecordset->Move((long)pos,vtMissing);
m_pRecordset->PutCollect("姓名",(_bstr_t)m_name);
m_pRecordset-->Update();
}

7.删除数据
m_pRecordset->Move((long)pos,vtMissing);
m_pAdoRecordset->Delete(adAffectCurrent);
m_pRecordset-->Update();
    try
    {
       //假设删除第10条记录
       m_pRecordset->MoveFirst();//注意一定要移到第一个
       m_pRecordset->Move(9);
       m_pRecordset->Delete(adAffectCurrent);
       //参数adAffectCurrent为删除当前记录
       m_pRecordset->Update();
    }
    catch(_com_error *e)
    {
       AfxMessageBox(e->ErrorMessage());
    }

8.保存图片( 参考下一篇博客)
 char *m_pBuffer;//文件数据
 DWORD m_filelen;//文件长度
 VARIANT varblob;
 SAFEARRAY *psa;
 SAFEARRAYBOUND rgsabound[1];
 rgsabound[0].lLbound=0;
 rgsabound[0].cElements=m_filelen;
 psa=SafeArrayCreate(VT_UI1,1,rgsabound);
 for(long i=0;i<(long)m_filelen;i++)
 {
  SafeArrayPutElement(psa,&i,m_pBuffer++);
 }
 //记录值
 varblob.vt=VT_ARRAY|VT_UI1;
 varblob.parray=psa;
 m_pRecordset->GetFields()->GetItem("PHOTO_DATA")->AppendChunk(varblob);
 m_pRecordset->Update();
读取数据库语音数据
long lDataSize=m_pRecordset->GetFields()->GetItem("voice")->ActualSize;//取得数据区域大小
char *m_pBuffer;
if(lDataSize>0)
{
//读取数据到varBLOB中
_variant_t varBLOB;
varBLOB=m_pRecordse->GetFields()->GetItem("voice")->GetChunk(lDataSize);
if(varBLOB.vt==(VT_ARRAY|VT_UI1))
 {
 if(m_pBuffer=new char[lDataSize+1])
 {
 char *pBuf=0;
 SafeArrayAccessData(varBLOB.parray,(void**)&pBuf);
 memcpy(m_pBuffer,pBuf,lDataSize);//赋值数据到m_pBuffer
 SafeArrayUnaccessData(varBLOB.parray);
 }
 }
}

其他连接方法
打开
 m_pAdoRecordset=NULL;
 m_pAdoConnect=NULL;//初始化
 iCurrentOne=-1;
 //*******************************************
 if(FAILED(::CoInitialize(NULL)))//这句话很重要!
 {
  ::AfxMessageBox(_T("fail to CInitialize(NULL)"));
  PostQuitMessage(-8);//?
 }
 HRESULT hr=m_pAdoConnect.CreateInstance(__uuidof(Connection));
 if(FAILED(hr)){
  ::AfxMessageBox(_T("fail to create instance for _ConnectPtr"));
  PostQuitMessage(-8);
 }
 bstr_t strConnect="DSN=FRDB;\
       DBQ=H:\\FRDB.accdb;\
       DriverID=25;FIL=MS Access;MaxBufferSize=2048;PageTimeout=5;";
 try{
  m_pAdoConnect->Open(strConnect,"clc","",NULL);
 }
 catch(_com_error &e)
 {
  ::AfxMessageBox(e.Description());
  PostQuitMessage(-8);
 }
 m_pAdoRecordset=NULL;
 hr=m_pAdoRecordset.CreateInstance(__uuidof(Recordset));
 if(FAILED(hr)){
  ::AfxMessageBox(_T("fail to create instance for _RecordsetPtr"));
  PostQuitMessage(-8);
 }
 m_pAdoRecordset->Open(_variant_t("Person"),_variant_t((IDispatch*)

m_pAdoConnect,true),adOpenKeyset,adLockOptimistic,adCmdTable);
关闭
 if(m_pAdoRecordset){ if(m_pAdoRecordset->State==adStateOpen){
   m_pAdoRecordset->Close(); }}
 if(m_pAdoConnect)
 { if(m_pAdoConnect->State==adStateOpen){
   m_pAdoConnect->Close();}}
  ::CoUninitialize();//关闭线程下的数据库
添加数据
m_pAdoRecordset->Fields->GetItem(_variant_t("NAME"))->Value=_variant_t(m_sName);
载入数据
m_sName=(CStringW)(m_pAdoRecordset->Fields->Item[_variant_t("NAME")]->Value);

MFC ADO数据库操作的更多相关文章

  1. VC与ADO数据库操作

    VC与ADO数据库操作 学研部的同志们,大家好! 想开一次学习会,实习时间冲突了,只好把文档发给大家看了.重点推荐李振龙的BMP读图教程! 尤其是大三GIS班的同志,注意了,可能实习用得上的! 一.A ...

  2. ADO数据库操作

    void CSjtestDlg::OnBnClickedButtonAdd() { // TODO: 在此添加控件通知处理程序代码 this->ShowWindow(SW_HIDE); DigA ...

  3. MFC,ADO方式实现数据库操作

    参考: MSDN数据访问编程 (MFC/ATL): https://msdn.microsoft.com/zh-cn/library/kd4ck1tt.aspx?f=255&MSPPError ...

  4. MFC中使用ADO进行数据库操作

    参考FROM:http://hi.baidu.com/sunkanghome/item/e1fda510b3186359f1090ee2 数据库与数据库编程: 当前各种主流数据库有很多,包括Oracl ...

  5. VC++中使用ADO方式操作ACCESS数据库

    ADO(ActiveX Data Object)是Microsoft数据库应用程序开发的新接口,是建立在OLE DB之上的高层数据库访问技术,即使你对OLE DB,COM不了解也能轻松对付ADO,因为 ...

  6. VC++ MFC SQL ADO数据库访问技术使用的基本步骤及方法

    1.首先,要用#import语句来引用支持ADO的组件类型库(*.tlb),其中类型库可以作为可执行程序 (DLL.EXE等)的一部分被定位在其自身程序中的附属资源里,如:被定位在msado15.dl ...

  7. ADO.NET操作数据库(一)

    ---恢复内容开始--- [1]ADO.Net简介2015-12-07-20:16:05 ADO.Net提供对Microsoft SQL Server数据源以及通过OLE DB和XML公开的数据源的一 ...

  8. 数据库操作(ADO)

    QTP工具本身自带有数据查询和验证功能,但是使用的人会感觉这个功能使用起来比较麻烦,灵活性和复用性较低,于是我们选择了用脚本调用ADO组件实现数据库的操作,现总结下工作中用到的数据库操作,代码如下: ...

  9. ado.net的简单数据库操作(二)之封装SqlHelperl类

    今天我书接上回,接着昨天的ado.net的数据库操作的相关知识来讲哈! 从上篇文章给出的实例来看,你一定会发现,操作数据库其实还挺麻烦的,就连一个最简单的数据库操作语句都要包括 定义数据库连接字符串. ...

随机推荐

  1. hdu 5289 Assignment(给一个数组,求有多少个区间,满足区间内的最大值和最小值之差小于k)

    1.区间是一段的,不是断开的哟 2.代码是看着标程写的 3.枚举左端点,二分右端点流程: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L ...

  2. ny540 奇怪的排序 简单题

    奇怪的排序 时间限制:1000 ms  |  内存限制:65535 KB 难度:1 描述 最近,Dr. Kong 新设计一个机器人Bill.这台机器人很聪明,会做许多事情.惟独对自然数的理解与人类不一 ...

  3. mongodump 失败且导致mongo服务挂掉【本质原因,wt文件损坏】

    ====================================================== 标题遇到的问题是我要解决的问题的中间环节. 原本问题是:需要在之前standlone的Mo ...

  4. python 类的使用实例方法

    class A: dict_1 = 456 def __init__(self): self.dict_1 = 'abcdsafdsf' #当增加@staticmethod 时为类方法 @static ...

  5. Python获取时间范围内日期列表和周列表的函数

    1.获取日期列表 # -*- coding=utf-8 -*- import datetime def dateRange(beginDate, endDate): dates = [] dt = d ...

  6. vim 删除一整块,vim 删除一整行

    dd: 删除游标所在的一整行(常用) ndd: n为数字.删除光标所在的向下n行,例如20dd则是删除光标所在的向下20行 d1G: 删除光标所在到第一行的所有数据 dG: 删除光标所在到最后一行的所 ...

  7. c语言实现类似重载的功能

    今天man了一下open,发现open函数的原型居然看着是重载,C语言不是不支持重载么,经过一番搜寻之后,总结如下: 可变长参数函数 C语言是不支持函数重载机制的,但是支持变长参数函数,当然C++也是 ...

  8. 【Unity笔记】UGUI的Image、RawImage控件

    Image控件只能使用Sprite图片,RawImage通常使用Texture类型图片.项目设为2D模式后导入的图片Texture Type会自动转为Sprite. 没有选择源图片时,可以只选择颜色. ...

  9. Android 自定义Adapter实现多视图Item的ListView

    自定义Adapter实现多视图Item的ListView http://www.devdiv.com/adapter_item_listview-blog-20-7539.html 1.原理分析 Ad ...

  10. BusyBox telnet配置

    1.  busybox配置telnet相关命令. 2.  devpts文件系统,是目前最常见的pseudo终端,使用telnetd服务器,必须加载该文件系统. 在/dev目录下创建一个pts目录,用来 ...