关闭

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

50人阅读 评论(0) 收藏 举报

 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

猜你在找
【直播】机器学习&数据挖掘7周实训--韦玮
【套餐】系统集成项目管理工程师顺利通关--徐朋
【直播】3小时掌握Docker最佳实战-徐西宁
【套餐】机器学习系列套餐(算法+实战)--唐宇迪
【直播】计算机视觉原理及实战--屈教授
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之矩阵--黄博士
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之凸优化--马博士
【套餐】Javascript 设计模式实战--曾亮
查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:4272次
    • 积分:254
    • 等级:
    • 排名:千里之外
    • 原创:22篇
    • 转载:9篇
    • 译文:0篇
    • 评论:0条
    文章分类