Recordset对象,Open方法,第一个参数可以使用Command对象,但是不知道参数要怎么填写?
m_pRecordset->Open(_variant_t( (IDispatch*)pCommand, true),_variant_t((IDispatch*)NULL,true),CursorType, LockType, lOption )
有谁这么用过的?给个成功的代码例子。谢谢

解决方案 »

  1.   

    利用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的execute一样可以获得记录集合
      

  2.   

    上面的代码我知道,但是这种方式得到的记录集有一个很大的缺陷。
    就是记录集的打开方式是adOpenForwardOnly的。一般情况下没什么问题,但在我的程序当中,
    使用的时候,不是那么方便。我希望打开方式是adOpenDynamic。
    但是我又必须使用Command对象(譬如访问预编译SQL,或者存储过程)。 
    ado的Recordset的对象的open方法,支持直接将Command对象作为第一个参数(即数据源参数).
    但是我没有实验成功。如果试验成功,我就可以将Recordset打开方式事先修改为adOpenDynamic
    类型。============下面是ado210.chm中的说明===============================
    Open 方法 (ADO Recordset)   
    打开游标。
    语法
    recordset.Open Source, ActiveConnection, CursorType, LockType, Options
    参数
    Source   可选,变体型,计算 Command 对象的变量名、SQL 语句、表名、存储过程调用或持久 Recordset 文件名。
    ActiveConnection   可选。变体型,计算有效 Connection 对象变量名;或字符串,包含 ConnectionString 参数。使用 Recordset 对象的 Open 方法可打开代表基本表、查询结果或者以前保存的 Recordset 中记录的游标。
    使用可选的 Source 参数指定使用下列内容之一的数据源:Command 对象变量、SQL 语句、存储过程、表名或完整的文件路径名。
    如果 Source 是文件路径名,它可以是完整路径(“c:\dir\file.rst”)、相对路径(“..\file.rst”)或 URL(“http://files/file.rst”)。
      

  3.   

    这个文档我也看过很少看到例子有这么一句话如果在 Source 参数中传送 Command 对象并且同时传递 ActiveConnection 参数,那么将产生错误。Command 对象的 ActiveConnection 属性必须已经设置为有效的 Connection 对象或者连接字符串。是不是,如果是用command对象的时候,ActiveConnection 这个参数不能传递连接
    你试试用null呢
      

  4.   

    另外,你open的时候,try,catch一下,看看是什么错
      

  5.   

    已经测试成功了。之前就是vNULL没有传对。谢谢你的代码了。
    _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 )