zoukankan      html  css  js  c++  java
  • VC++下使用ADO访问Access数据库完整篇 Chars

    1、在StdAfx.h中引入ADO类支持
    方法是在StdAfx.h中增加下面两句话:

    #include <comdef.h>//如果需要则添加本句

    #import "c:\program files\common files\system\ado\msado15.dll" no_namespace rename ("EOF", "adoEOF")

    2、初始化COM环境
    在MFC中可以用AfxOleInit()或CoInitialize(NULL),该函数一般放在InitInstance()历程里。

    非MFC使用用CoInitialize(NULL)。

    卸载COM环境使用CoUnInitialize(),一般放在主程序的析构函数里。

    这样我们就会三个指针可用:_ConnectionPtr、_RecordsetPtr和_CommandPtr,分别代表:

    _ConnectionPtr接口返回一个记录集或一个空指针,通常使用它来创建一个数据连接或执行一条不返回任何结果的SQL语句,对于要返回记录的操作通常使用_RecordserPtr来实现。而用 _ConnectionPtr操作时要想得到记录条数得遍历所有记录,用_RecordserPtr则不需要。

    _RecordsetPtr指针是一个记录集对象。可以对记录集提供了更多的控制功能。它不一定要使用一个已经创建的数据连接,可以用一个连接串代替连接指针赋给 _RecordsetPtr的connection成员变量,让它自己创建数据连接。如果你要使用多个记录集,最好的方法是使用已经创建了数据库连接的全局_ConnectionPtr接口,然后使用_RecordsetPtr执行存储过程和SQL语句。

    _CommandPtr指针接口返回一个记录集。CommandPtr提供了一种简单方法来执行返回记录集的存储过程和SQL语句。可以利用全局 _ConnectionPtr接口,也可以在_CommandPtr接口里直接使用连接串。一次或少量数据库访问操作,一般是直接使用连接串,如果需要频繁访问数据库,涉及返回多个记录集,那么,建议同_RecordsetPtr用法一样,使用全局数据库连接后,再使用_CommandPtr 接口执行存储过程和SQL语句。

    各指针的定义方法:

    _ConnectionPtr m_pConnection;

    _RecordsetPtr m_pRecordset;

    _CommandPtr m_pCommand;

    3、连接、关闭数据库
    1、连接数据库

    示例连接ACCESS,以昨天的FavorMan为例。

    ::CoInitialize(NULL);//数据库操作前先初始化COM环境

    CString strSQL; //配置初始连接串
    strSQL="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=blogurl.mdb;";
    strSQL=strSQL+"Provider=Microsoft.Jet.OLEDB.4.0;"+"Data Source=blogurl.mdb;"+
    "Jet OLEDB:Database Password="+//str为上面读到数据库路径信息!
    DB_PASSWRD_STRING+";"+
    "Persist Security Info=False;"; //注意一定需要输入四个\\\\才能表示"\\"
    //如果单独输入,必须形式为"\\\\Abc\\db\\blogurl.mdb"格式!


    //--连接数据库-----------------
    HRESULT hr;
    try
    {
    hr = m_pConnection.CreateInstance("ADODB.Connection");///创建Connection对象
    if(SUCCEEDED(hr))
    {
    hr = m_pConnection->Open((_bstr_t)strSQL,"","",adModeUnknown);///连接数据库
    ///上面一句中连接字串中的Provider是针对ACCESS2000环境的,对于ACCESS97,需要改为:Provider=Microsoft.Jet.OLEDB.3.51; }
    }
    }
    catch(_com_error e)///捕捉异常
    {
    CString errormessage;
    errormessage.Format("连接数据库失败!\r\n错误:%s!",e.ErrorMessage());
    AfxMessageBox(errormessage);///显示错误信息

    return FALSE;
    }

    2、关闭数据库

    if( m_pConnection->State )//如果连接有效

    m_pConnection->Close();

    m_pConnection = NULL;

    4、数据库访问
    _RecordsetPtr m_pRecordset;

    m_pRecordset.CreateInstance("ADODB.Recordset");

    try
    {

    //打开数据库
    m_pRecordset->Open("SELECT * FROM BlogUrl",
    m_pConnection.GetInterfacePtr(),//或使用_variant_t((IDispatch*)theApp.m_pConnection,true),,但需要extern声明theApp;
    adOpenDynamic,
    adLockOptimistic,
    adCmdText);

    //遍历读取

    while(!m_pRecordset->adoEOF)//adoEOF判断数据库指针是否已经到结果集末尾;BOF判断是否在第一条记录前面
    {
    vID =m_pRecordset->GetCollect("ID");
    //这里已经读到当前记录的ID,需要进行非空等判断,非空之后就可以处理,比如添加到列表框等。

    //....
    m_pRecordset->MoveNext();
    }

    m_pRecordset->Close();//关闭记录集
    }
    catch(_com_error error)
    {
    CString errorMessage;
    errorMessage.Format("%s",(LPTSTR)error.Description());
    AfxMessageBox(errorMessage);

    }

    取得某字段的值有两种办法,一种是指定该字段名,另一种是指定该字段的ID编号,从0开始。

    假设上文的ID是从0开始,那么可以采用:
    m_pRecordset->GetCollect(_variant_t(long(0));

    也可以采用:
    pRecordset->get_Collect("ID");

    其它索引值读取类似处理。
    附一些常用的执行语法:
    1、添加记录

    a、调用m_pRecordset->AddNew();

    b、调用m_pRecordset->PutCollect("ID",vID);给ID字段赋值

    c、调用m_pRecordset->Update();//确认并刷新入库

    2、修改记录

    方法类似添加记录,只是起初按照查询指定记录打开接口,比如SELECT * FROM ulist where ID=%d形式,不需要m_pRecordset->AddNew();,直接使用PutCollect("ID",vID)。

    3、删除记录

    删除记录只需要把记录指针移动到要删除的记录上,然后调用m_pRecordset->Delete(adAffectCurrent)

    移动到指定记录上也有两种方法,一种直接使用查询指定记录(需要唯一字段)方式定位,另一种是使用Move(index)方式。

    下面例子是使用Move方式到指定记录。

    try

    {

    m_pRecordset->MoveFirst();//如果是采用SELECT * FROM ulist where ID=5方式打开数据库连接则不需要本句

    m_pRecordset->Move(5);//假设删除第5条记录,如果是采用SELECT * FROM ulist where ID=5方式打开数据库连接则不需要本句

    m_pRecordset->Delete(adAffectCurrent);

    m_pRecordset->Update();

    }

    catch(_com_error error)

    {

    CString errorMessage;

    errorMessage.Format("%s",(LPTSTR)error.Description());

    AfxMessageBox(errorMessage);

    }

    4、_CommandPtr用法参考

    a、_CommandPtr指针初始化

    m_pCommand->ActiveConnection = m_pConnection;// 将库连接赋于它,或单独再创建也可以,根据实际需要定
    m_pCommand->CommandText = "SELECT * FROM BlogUrll";

    b、_CommandPtr与_RecordsetPtr配合读取记录集

    m_pRecordset = m_pCommand->Execute(NULL, NULL,adCmdText);//执行SQL语句,返回结果记录集

    c、直接使用_ConnectionPtr执行SQL语句

    m_pConnection->Execute( _bstr_t CommandText,VARIANT * RecordsAffected,long Options )

    例如:

    m_pConnection->Execute("UPDATE BlogUrl SET ID= 1 WHERE ID = 5",&RecordsAffected,adCmdText);

    5、遍历数据库中所有表名

    m_pRecordset = m_pConnect->OpenSchema(adSchemaTables);

    while(!(m_pRecordset ->adoEOF))
    {
    _bstr_t tblname = m_pRecordset->Fields->GetItem("TABLE_NAME")->Value;//获取表格

    _bstr_t tbltype = m_pRecordset->Fields->GetItem("TABLE_TYPE")->Value;//获取表格类型

    //这里可以对表格类型进行判断,判断后即可处理tblname

    if (!strcmp(tbltype ,"TABLE"))
    {
    AfxMessageBox(tblname);
    }

    m_pRecordset->MoveNext();
    }
    m_pRecordset->Close();

    6、遍历一个表中的所有字段

    //方法1:

    m_pRecordset = m_pConnect->OpenSchema(adSchemaColumns);

    while(!(m_pRecordset ->adoEOF))
    {
    _bstr_t colname = m_pRecordset->Fields->GetItem("COLUMN_NAME")->Value;//获取字段名

    AfxMessageBox(colname);

    m_pRecordset->MoveNext();
    }
    m_pRecordset->Close();
    //方法2:

    FieldsPtr pFields = NULL;

    HRESULT hr = m_pRecordset->get_Fields (&pFields);//得到记录集的字段集

    if(!SUCCEEDED(hr)) return;

    int iColCount;

    pFields->get_Count(&iColCount);//字段总数

    BSTR bstrColName;

    for(int i=0;i<iColCount;i++)//按记录集的各字段循环

    {

    //pFields->GetItem(_variant_t(i))->get_Name(&bstrColName);

    pFields->Item(_variant_t(i))->get_Name(&bstrColName);//获得字段名字

    CString csName=bstrColName;

    //pField->Item[i]->get_Type(&fType);//获取字段类型

    //pField->Item[i]->get_DefinedSize(&lSize);//获得字段的大小

    AfxMessageBox(csName);
    }
    if(NULL != hr)
    tblfields ->Release();//释放指针

    7、常用数据格式转换

    _variant_t var;

    BSTR bvar;

    CString csVar;

    _bstr_t bstr;

    _variant_t 转化为long型: (long)var;

    _variant_t转化为 CString型: csVar= (LPCSTR)_bstr_t(var);

    CString转化为_variant_t型: _variant_t(csVar);或(LPTSTR)(LPCTSTR)csVar;

    CString转化为BSTR型: bvar= csVar.AllocSysString();

    BSTR转化为CString型:csVar= (LPCSTR)bvar;

    CString转化为_bstr_t型: bstr = (_bstr_t)csVar;

    _bstr_t 转化为CString型:csVar= (LPCSTR)bstr;

  • 相关阅读:
    django models设置联合主键
    sql语句清空表数据
    mysql交互模式下执行sql文件
    linux 下安装虚拟环境和创建虚拟环境
    解决Eclipse中无法直接使用sun.misc.BASE64Encoder及sun.misc.BASE64Decoder的问题
    mssql语法
    PowerDesigner的使用
    NoSuchMethodError错误
    在windows、widfly环境下,远程debug
    Blocking request failed HttpServerExchange{ GET /ssssssssss/kkk}: java.lang.StringIndexOutOfBoundsException: String index out of range: -1
  • 原文地址:https://www.cnblogs.com/chars/p/2867124.html
Copyright © 2011-2022 走看看