vc ado

5 篇文章 0 订阅

1.导入ado库

在StdAfx.h中,加入如下代码

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

            no_namespace  rename("EOF","adoEOF") rename("BOF","adoBOF")

 

 

2.Com 初试化

在app的InitInstance中,加入

 

AfxOleInit();(MFC)

或者

CoInitialize(NULL)

 

如果用了CoInitialize

 

退出时,要调用CoUninitialize()

 

 

注意,如果在线程中也使用了com,那么在线程中也要用CoInitialize初始

 

 

3.连接数据库

 

_ConnectionPtr  m_pAppConn;

 

 

hResult = m_pAppConn.CreateInstance(_T("ADODB.Connection"));///创建Connection对象

 

 

然后连接之

m_pAppConn->Open("Provider=Microsoft.Jet.OLEDB.4.0 ; /

  Data Source = .//DataBase//aa.mdb",

        "","",adModeUnknown);

 

BOOL OpenConnect()

{

 HRESULT hResult;

 

 CloseConnect();

 

 try

 {

  hResult = m_pAppConn.CreateInstance(_T("ADODB.Connection"));///创建Connection对象

  if(SUCCEEDED(hResult))

  {

   m_pAppConn->Open("Provider=Microsoft.Jet.OLEDB.4.0 ; /

            Data Source = .//DataBase//aa.mdb",

              "","",adModeUnknown);

  } 

 

 }

 

 catch(_com_error e)///捕捉异常

 {

  CString errormessage;

  errormessage.Format(_T("连接数据库失败!/r/n错误信息:%s"),e.ErrorMessage());

  AfxMessageBox(errormessage);

 

  hResult = -1L;

 } 

 

 return (SUCCEEDED(hResult) ? TRUE : FALSE);

}

 

 

这里连接的数据库是access数据库,在工程目录下的DataBase/aa.mdb

 

关键连接的字符窜,

如果是access

 

Provider=Microsoft.Jet.OLEDB.4.0;Data Source=//192.168.1.1/DataBase/aa.mdb;

这是局域网上的文件

 

Provider=Microsoft.Jet.OLEDB.4.0;Data Source=.//DataBase//aa.mdb;

本机上的

 

如果是sql 2000

Provider=SQLOLEDB.1;Persist Security Info=True;User ID=sa;Password=sa;Initial Catalog=aa;Data Source=192.168.1.1;

数据库在192.168.1.1上,数据库名字是aa

 

 

4.关闭连接

 

BOOL CloseConnect()

{

 HRESULT hResult=0;

 

 try

 {

  if(m_pAppConn!=NULL)

  {

   if(m_pAppConn->State!=adStateClosed)

   {

    hResult=m_pAppConn->Close(); 

   }

 

   m_pAppConn.Release();

  }

 }

 

 catch(_com_error e)

 {

  _bstr_t bstrSource(e.Source());

 

  _bstr_t bstrDescription(e.Description());

 

  TRACE(_T("/n Source : %s /n Description : %s /n"),(LPCSTR)bstrSource,(LPCSTR)bstrDescription);

 

  hResult=-1L;

 

 }

 

 return (SUCCEEDED(hResult) ? TRUE : FALSE);

 

}

 

 

5.使用recodeset打开记录

 

  _variant_t      RecordsAffected;

 _RecordsetPtr   pRecordset = NULL;

 

 

        strSql = _T("SELECT field FROM table");

 

     pRecordset.CreateInstance(_uuidof(Recordset));

    pRecordset = pConn->Execute (_bstr_t(strSql) , &RecordsAffected , adCmdUnknown);

 

   其中&RecordsAffected 可以获得有多少记录返回,这是记录的影像数目

 

 

6.关闭记录集

 if(pRecordset != NULL && pRecordset->State)

  {

   pRecordset->Close();

   pRecordset = NULL;  

  } 

 

7.判断是否为空

 if (pRecordset->adoBOF && pRecordset->adoEOF)

 {

  //MessageBox("没有符合条件的记录存在!","提示");

  if(pRecordset != NULL && pRecordset->State)

  {

   pRecordset->Close();

   pRecordset = NULL;  

  } 

  return;

 }

 

 

8,从记录集取数据

 

_variant_t      var;

 

  pRecordset->MoveFirst();

 

 for(;!pRecordset->adoEOF;pRecordset->MoveNext())

 {

  var = pRecordset->GetCollect(_T("field"));

 }

 

9.几种常见数据的转换

 如果是字符窜的字段

 

  var = pRecordset->GetCollect(_T("field"));

  if(var.vt!=VT_NULL)

  {

   str= (LPCTSTR)_bstr_t(var);

  }

 

 if(var.vt!=VT_NULL)

判断是必须的,如果是空,转换会出错

 

如果是int形

int aa = atoi(str)

 

_variant_t是个可变类型,支持很多种类型,

 

 

10.使用command

 

利用Command对象来执行SQL命令 

_CommandPtr m_pCommand;

m_pCommand.CreateInstance("ADODB.Command");

_variant_t vNULL;

vNULL.vt = VT_ERROR;

vNULL.scode = DISP_E_PARAMNOTFOUND;///定义为无参数

m_pCommand->ActiveConnection = m_pConnection;///非常关键的一句,将建立的连接赋值给它

m_pCommand->CommandText = "SELECT * FROM users";///命令字串

m_pRecordset = m_pCommand->Execute(&vNULL,&vNULL,adCmdText);///执行命令,取得记录集

 

 

如果使用记录集的open来打开command对象.

如果在 Source 参数中传送 Command 对象并且同时传递 ActiveConnection 参数,那么将产生错误。Command 对象的 ActiveConnection 属性

 

必须已经设置为有效的 Connection 对象或者连接字符串。

 

所以

_variant_t vNULL;

vNULL.vt = VT_ERROR;

vNULL.scode = DISP_E_PARAMNOTFOUND;

_CommandPtr pCommand; 

...

m_pRecordset->Open(_variant_t( (IDispatch*)pCommand, true),vNULL,CursorType, LockType, lOption )

 

 

11.关于数据中时间的处理

首先,sql语句中有很多时间处理的函数,可以拿来使用,如果不使用这些函数,那么直接用sql语句来拼写

 

CString strDate= "2006-8-11";

 

CString strsql;

 

strsql.Format("SELECT * FROM Table where Date=#%s#",strDate);

 

m_pRecordset->Open(_bstr_t(strsql),               

           theApp.m_pConnection.GetInterfacePtr(), 

  adOpenDynamic,

  adLockOptimistic,

  adCmdText);

 

accee用#时间,其他大部分都是用''来括的

 

 

如果返回得到一个时间,那么

CString类型的变量转化成COleDateTime

 

COleDateTime::ParseDateTime

 

或者

 

CString str = "2004-07-08 11:22:33"; 

COleVariant VariantTime;

VariantTime = str;

VariantTime.ChangeType(VT_DATE);

COleDateTime DataTime = VariantTime;

 

反过来转,更简单了,

COleDateTime有format 函数,包括CTime也有这样的函数

 

 

12,插入或者删除记录

 strSql.Format(_T(" INSERT INTO table VALUES('%s','%s','%s','%s',#%s#)"),

               strID,strName,strAuthor,strPublisher,strDate);

 

 

 try

 {

  pConn->Execute (_bstr_t(strSql) , &RecordsAffected , adCmdUnknown); 

 }

 

 

 

 

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/handsomerun/archive/2006/08/12/1055311.aspx 本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/handsomerun/archive/2006/08/12/1055311.aspx

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值