_CommandPtr m_pCommand;
_ConnectionPtr m_pConnection; m_pRecordset.CreateInstance(__uuidof(Recordset));
m_pRecordset->Open((_variant_t)str,theApp.m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
if(m_pRecordset->adoEOF&&m_pRecordset->BOF) {AfxMessageBox("您输入的用户名或密码错误,请重新输入!");return ;}
m_pRecordset->Close();1
_ConnectionPtr这个东西是个什么,书上说数据库连接用Connection类,但是声明的时候都用的_ConnectionPtr,它是什么东西。
2、_uuidof它是什么,是不函数还是什么,它的作用是什么?
3、GetInterfacePtr这个函数的作用是什么啊?请指点,搞了很久没弄明白

解决方案 »

  1.   

    1.
    _CommandPtr _ConnectionPtr _RecordsetPtr都是智能指针类。这都从ADO COM中导出的类。这些指针类很好的封装了创建实例和释放,所以使用起来还是相对比较安全的。
    智能指针类通过.CreateInstance来创建对应ADO对象的实例,2.__uuidof是操作符,可以引用指定表达式的guid
    把Recordset和Connection这些名称转换为guid,因为COM对象都会在在系统注册clsid以及guid标示其唯一,同时注册了名字。可以通过guid或者名字来引用要创建的对象进行实例化m_pRecordset.CreateInstance("ADODB.Recordset");这样也是可以的3.recordset对象的open方法的参数需要一个connection对象,在C++里,COM对象的方法参数一般都是要求Variant类型,这里要求得是connection的借口指针,GetInterfacePtr是com的智能指针类的方法
    另外一种写法
    m_pRecordset->Open((_variant_t)str,_variant_t((IDispatch *)(theApp.m_pConnection)),adOpenDynamic,adLockOptimistic,adCmdText);
      

  2.   

    真郁闷了,看来学个数据库还得学com
      

  3.   

    不用吧,会用就可以了,就当作以写好的类用就行了。com记得初始化和释放
      

  4.   

    _variant_t,表达式的guid,IDispatch *这些东西是什么,我现在仍然搞不懂,想问一下,从书上的哪部分能找到这些问题的答案啊,我的书上好像都没有讲过这些
      

  5.   

    ADO210.chm里面有,在你的计算机里搜索ADO*.chm
      

  6.   

    ADO 是一个 IDispatch 接口,这一点虽然很少提及,但却至关重要。只要将指向 ADO 对象的指针作为 Variant 传递,就必须将该指针指定为指向 IDispatch 接口的指针。这句话的意思很明确了,对于ADO for vc开发,大多数方法的参数都是variant类型,那么ADO COM中的recordset,connection这种智能指针类型作为参数传递的时候,就需要被转换为IDispatch *,当然如果还需要更了解,建议你还是把COM的书多了解一下,对于ado的普通开发,不需要了解到那一层次COM 特有的数据类型
    Variant ,BSTR, SafeArray
    相对应的有_variant_t,_bstr_t类封装和管理该类型
      

  7.   

    vieri_ch(尘雨) ( ) 真的是好同志呀,我找到了你说的帮助,解决了两天来的问题!借宝地感谢一下他!