c++使用ado连接 sqlserver使用注意点

来源:互联网 发布:linux 退出文件编辑 编辑:程序博客网 时间:2024/06/07 07:23

 c++使用ado连接 sqlserver使用注意点

1.创建失败问题
// 创建Connection对象
        HRESULT hr = m_pConnection.CreateInstance(__uuidof(Connection));
        if(FAILED(hr))
  {  
            PAG_ERROR("_ConnectionPtr对象指针实例化失败 请确保路径[%s] 版本为:%s 存在msado15.dll", SQLDATAHPLUG_ADO_PATH,

SQLDATAHPLUG_ADO_VER);

解决方法:
  利用其它低版本的msado进行编译,注意指定文件夹
  或者用其他可以用的电脑进行开发

2.反初始化异常:退出数据库错误对象关闭时,不允许操作问题

  解决方法:State !=adStateClosed
 if (m_pRecordset != NULL)
 {
            if (m_pRecordset->State !=adStateClosed)
            {
                m_pRecordset->Close();
            }
 }
 if (m_pConnection != NULL)
        {
            if(m_pConnection->State!=adStateClosed)
            {
                m_pConnection->Close();
            }
 }

3.结果总数
rec->RecordCount 总是为0或者-1
解决方法两种:
1)要先把记录走一遍,再调用
   用rec->RecordCount前,先调用movefirst()和movelast
2)
pRecordSet.CreateInstance(_uuidof(Recordset));
 pRecordSet->CursorType=adOpenStatic;//静态游标

4、利用序号得到字段值方法抛异常---在对应所需名称或序数的集合中,未找到项目

for(int iField=0; iField< uiField; iField++)
_variant_t  Index = iField;
tring StrFieValue= (char *)(_bstr_t)m_pRecordset->GetFields()->GetItem(Index)->GetValue();//取得值


解决方法:
1)静态打开
    //   hr  = m_pRecordset->Open(bstrSQL,m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
    // 取得表中的记录 利用字段的序号获取值
   hr  = m_pRecordset->Open(bstrSQL ,_variant_t((IDispatch *)m_pConnection,true), adOpenStatic,adLockOptimistic,adCmdText);


    //int 改为long
   for(long iField=0; iField< uiField; iField++)
    _variant_t  Index = iField;

5、
value指向一堆乱码...
_variant_t转换为char *:
错误方法:

_variant_t vValue;  .char * value=(LPSTR)(LPCSTR)_bstr_t(vValue) 
 
value指向一堆乱码...
 
原因:不能用char *直接指向(LPSTR)(LPCSTR)_bstr_t( _variant_t ),因为这样转换之后实际上是一个string,而非一个char *
 

正确方法:
 进行转换时,只能用strcpy(),将LPSTR指向的字符复制到char * 所指向的内存中

 

6.反初始化:

 

CoInitialize(NULL);
   CLSID clsid;
   CLSIDFromProgID(OLESTR("myCom.GetRes"),&clsid);
   CComPtr<IGetRes> pGetRes;//智能指针
   pGetRes.CoCreateInstance(clsid);
   pGetRes->Hello();
   pGetRes.Release();//小心哦!!请看最后的“注意”
   CoUninitialize();

注意:

问题在与,我们的智能指针pGetRes生命周期的结束是在
CoUninitialize()之后,CoInitialize所开的套间在CoUninitialize()后已经被
关闭,而pGetRes此时发生析构,导致了程序的崩溃,解决这个问题的另一个方法是
   CoInitialize(NULL);
   CLSID clsid;
   CLSIDFromProgID(OLESTR("myCom.GetRes"),&clsid);
   {
   CComPtr<IGetRes> pGetRes;//智能指针
   pGetRes.CoCreateInstance(clsid);
   pGetRes->Hello();
   }
   CoUninitialize();

 

0 0
原创粉丝点击