请问在MFC中可以使用ADO链接数据库的方式嘛?
我先前的整个程序都是用的ODBC,如果中间穿插ADO可以嘛?
因为我也要把图片存入到数据库中,但是大部分资料都是ADO链接的,
可是当我在stafx.h中 import....之后
在程序中写入_RecordsetPtr pr它却告诉我_RecordsetPtr是不识别的,
请问这是什么原因。先谢谢了。

解决方案 »

  1.   

    还有请问#import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF", "adoEOF")
    这句话应该是加在哪里的?:))
      

  2.   

    一、引入ADO库文件:
    在stdafx.h中:
    #import “c:\program files\common files\system\ado\msado15.dll” no_namespaces rename(“EOF”,”adoEOF”)二、初始化OLE/COM库环境
    在App的InitInstance中:
    AfxOleInit();
      

  3.   

    当我加入在C..View.cpp 的时候,出现以下这些错误,这是什么原因?
    error C2011: 'LockTypeEnum' : 'enum' type redefinition
    d:\meii\debug\msado15.tlh(214) : error C2011: 'DataTypeEnum' : 'enum' type redefinition
    d:\meii\debug\msado15.tlh(258) : error C2011: 'FieldAttributeEnum' : 'enum' type redefinition
    d:\meii\debug\msado15.tlh(279) : error C2011: 'EditModeEnum' : 'enum' type redefinition
    d:\meii\debug\msado15.tlh(287) : error C2011: 'RecordStatusEnum' : 'enum' type redefinition
    d:\meii\debug\msado15.tlh(407) : warning C4146: unary minus operator applied to unsigned type, result still unsigned
    d:\meii\debug\msado15.tlh(530) : error C2011: 'ParameterDirectionEnum' : 'enum' type redefinition
    Generating Code...
    Error executing cl.exe.Meii.exe - 6 error(s), 1 warning(s)
      

  4.   

    转《用ADO操作数据库的方法步骤》具体出处给忘记了,如果侵犯版权请谅解!

    /***********************ADO接口简介 ***********************************/
    ADO库包含三个基本接口:_ConnectionPtr接口、_CommandPtr接口和_RecordsetPtr接口。 _ConnectionPtr接口返回一个记录集或一个空指针。
    通常使用它来创建一个数据连接或执行一条不返回任何结果的SQL语句,如一个存储过程。
    使用_ConnectionPtr接口返回一个记录集不是一个好的使用方法。
    通常同Cdatabase一样,使用它创建一个数据连接,然后使用其它对象执行数据输入输出操作。 _CommandPtr接口返回一个记录集。
    它提供了一种简单的方法来执行返回记录集的存储过程和SQL语句。
    在使用_CommandPtr接口时,你可以利用全局_ConnectionPtr接口,也可以在_CommandPtr接口里直接使用连接串。
    如果你只执行一次或几次数据访问操作,后者是比较好的选择。
    但如果你要频繁访问数据库,并要返回很多记录集,那么,你应该使用全局_ConnectionPtr接口创建一个数据连接,
    然后使用_CommandPtr接口执行存储过程和SQL语句。
     _RecordsetPtr是一个记录集对象。
    与以上两种对象相比,它对记录集提供了更多的控制功能,如记录锁定,游标控制等
    。同_CommandPtr接口一样,它不一定要使用一个已经创建的数据连接,
    可以用一个连接串代替连接指针赋给_RecordsetPtr的connection成员变量,让它自己创建数据连接。
    如果你要使用多个记录集,最好的方法是同Command对象一样使用已经创建了数据连接的全局_ConnectionPtr接口
    ,然后使用_RecordsetPtr执行存储过程和SQL语句。
      

  5.   

    转《用ADO操作数据库的方法步骤》具体出处给忘记了,如果侵犯版权请谅解!/***********************基本流程***********************************/
    (1)初始化COM库,引入ADO库定义文件
    (2)用Connection对象连接数据库
    (3)利用建立好的连接,通过Connection、Command对象执行SQL命令,或利用Recordset对象取得结果记
       录集进行查询、处理。
    (4)使用完毕后关闭连接释放对象。/***********************【1】COM库的初始化***********************************/
    我们可以使用AfxOleInit()来初始化COM库,这项工作通常在CWinApp::InitInstance()的重载函数中完
    成,请看如下代码:BOOL CADOTest1App::InitInstance()
    {
      AfxOleInit();
      ...... 
    }
    /***********************【2】用#import指令引入ADO类型库*************************/
    我们在stdafx.h中加入如下语句:
    #import "c:\program files\common files\system\ado\msado15.dll" no_namespace rename("EOF","adoEOF")
    其最终作用同我们熟悉的#include类似,编译的时候系统会为我们生成msado15.tlh,ado15.tli两个C++头文件来定义ADO库。/***********************【3】创建Connection对象并连接数据库*************************/首先我们需要添加一个指向Connection对象的指针:_ConnectionPtr m_pConnection;BOOL CADOTest1Dlg::OnInitDialog()
    {
    CDialog::OnInitDialog();
    try
    {
    HRESULT hr = m_pConnection.CreateInstance("ADODB.Connection");//创建Connection对象
    if(SUCCEEDED(hr))
    {
    hr = m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=test.mdb","","",adModeUnknown);//连接数据库
    //上面一句中连接字串中的Provider是针对ACCESS2000环境的,对于ACCESS97,需要改为:Provider=Microsoft.Jet.OLEDB.3.51;  }
    }
    }
    catch (_com_error e) //COM错误取得,当执行COM功能的时候,如果出错,可以捕捉到_com_error的异常
    {
    CString strComError;
    strComError.Format("错误编号: %08lx\n错误信息: %s\n错误源: %s\n错误描述: %s",
    e.Error(),                  // 错误编号
    e.ErrorMessage(),           // 错误信息
    (LPCSTR) e.Source(),        // 错误源
    (LPCSTR) e.Description());  // 错误描述

    ::MessageBox(NULL,strComError,"错误",MB_ICONEXCLAMATION);
    }
    }
    也可以使用UDL文件进行连接。
    try
    {
    m_pConnection.CreateInstance(__uuidof(Connection)); 
    m_pConnection->ConnectionString ="File Name=e.udl"; 
    m_pConnection->Open("","","",NULL); 
    }
    catch(_com_error e)
    {....}
      

  6.   

    转《用ADO操作数据库的方法步骤》具体出处给忘记了,如果侵犯版权请谅解!◆在这段代码中我们是通过Connection对象的Open方法来进行连接数据库的,下面是该方法的原型HRESULT Connection15::Open (_bstr_t ConnectionString, _bstr_t UserID, _bstr_t Password, long Options )ConnectionString 为连接字串,
    UserID 是用户名, 
    Password 是登陆密码,
    Options 是连接选项,用于指定Connection对象对数据的更新许可权, 
    Options可以是如下几个常量:

    adModeUnknown: 缺省。当前的许可权未设置
    adModeRead: 只读
    adModeWrite: 只写
    adModeReadWrite: 可以读写
    adModeShareDenyRead: 阻止其它Connection对象以读权限打开连接
    adModeShareDenyWrite: 阻止其它Connection对象以写权限打开连接
    adModeShareExclusive: 阻止其它Connection对象打开连接
    adModeShareDenyNone: 允许其它程序或对象以任何权限建立连接
    ◆常用的数据库连接方法:(1)通过JET数据库引擎对ACCESS2000数据库的连接
    m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\test.mdb","","",adModeUnknown);(2)通过DSN数据源对任何支持ODBC的数据库进行连接:
    m_pConnection->Open("Data Source=adotest;UID=sa;PWD=;","","",adModeUnknown);
    //m_pConnection->Open("DSN=test;","","",0);   //连接叫作test的ODBC数据源 (3)不通过DSN对SQL SERVER数据库进行连接: 
    m_pConnection->Open("driver={SQL Server};Server=127.0.0.1;DATABASE=vckbase;UID=sa;PWD=139","","",adModeUnknown);
    其中Server是SQL服务器的名称,DATABASE是库的名称◆先介绍Connection对象中两个有用的属性ConnectionTimeOut与State
    ConnectionTimeOut用来设置连接的超时时间,需要在Open之前调用,例如:
    m_pConnection->ConnectionTimeout = 5; //设置超时时间为5秒
    m_pConnection->Open("Data Source=adotest;","","",adModeUnknown);State属性指明当前Connection对象的状态,0表示关闭,1表示已经打开,我们可以通过
    读取这个属性来作相应的处理,例如:
    if(m_pConnection->State)
     m_pConnection->Close(); //如果已经打开了连接则关闭它
      

  7.   

    TO :pinel.
    我是在在stdafx.h中:
    加入的,
     二:在App的InitInstance中:
    AfxOleInit();
    那InitInstance里面的原来的代码要删嘛?可是还是出现下面这些错误:\meii\debug\msado15.tlh(214) : error C2011: 'DataTypeEnum' : 'enum' type redefinition
    d:\meii\debug\msado15.tlh(258) : error C2011: 'FieldAttributeEnum' : 'enum' type redefinition
    d:\meii\debug\msado15.tlh(279) : error C2011: 'EditModeEnum' : 'enum' type redefinition
    d:\meii\debug\msado15.tlh(287) : error C2011: 'RecordStatusEnum' : 'enum' type redefinition
    d:\meii\debug\msado15.tlh(407) : warning C4146: unary minus operator applied to unsigned type, result still unsigned
    d:\meii\debug\msado15.tlh(530) : error C2011: 'ParameterDirectionEnum' : 'enum' type redefinition
    错误,是什么原因呢?
      

  8.   

    我试了一下,只有重新建立一个工程,MFE.EXE--当达到step2/6的时候。如果选择E标题文件的话,就会出现上面的错误,这是为什么呢?
      

  9.   

    O
    是不是在step 5 OF 6中
    使用MFC lib
    有两个选项: D当共享DLL
                 还有一个是s当statically链接库,
    我选择的是D当共享DLL
      

  10.   

    step2包含头文件是指程序中包含ODBC或OLE DB的支持文件。用ADO时选择none。
    initinstance()函数不需要删除任何代码,afxoleinit()加到前面一点就行了。上面几位的蛮详细的。
      

  11.   

    我想是你的ADO导入的地方不对,应该在stdafx.h文件前面一大部分INCLUDE后面的ENDIF后,再加入IMPORT“”,否则就出你的那个现象。
      

  12.   

    写在initstance 函数的条件编译下面。