VC中使用ADO进行数据库开发的一些资料的整理

VC ADO

 

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); 
 }


删除也是类似的

添加删除的话,是不返回记录集的,其他的地方,和查询是一样的

 

 

你可能感兴趣的:(数据库,command,Security,null,table,Access)