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

原创 2015年07月09日 15:12:30

 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();

 

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

MFC使用ADO连接SQLServer数据库

MFC使用ADO连接SQLServer数据库。

详解MFC使用ADO连接SQLServer数据库

VC用ADO访问数据库全攻略,介绍了VC用ADO来访问数据库的各个对象及各方法,很经典,也很实用,很值得一看。 正文 一、ADO概述 ADO是Microsoft为最新和最强大的数据访问范...

CSharp 使用ADO连接 SQLServer2008

首先应该保证sqlServer打开了sqlServer身份验证 需要使用连接字符串连接数据库,该字符串格式为: Data Source=[实例名或主机名];Init...

VC使用ADO连接SQLServer数据库

转自:http://pcedu.pconline.com.cn/empolder/gj/vc/0507/653859.html VC用ADO访问数据库全攻略,介绍了VC用ADO来访问数据库的各个对象...

MFC使用ado连接SQLserver

做个小工具,记录MFC中用ado连接sqlserver2008的简要步骤。 首先还是简要介绍一下吧(一下这段为网上摘抄) ADO接口简介   ADO库包含三个基本接口:_ConnectionPtr...

vc6.0 使用Ado 连接MS-SqlServer2000 连接字符串

ADO连接字符串有两种,一种是使用DSN方法,另外一种是不适用DSN方法。 在网上查找了好久找到了一种简便的得到MS-SqlServer2000连接字符串的方法(不使用DSN的方法) 1.新建一个...

vs C++利用ado连接sqlserver2008实现一个查询功能

前段时间,正在学习怎样利用ado进行对

C++使用ADO连接MySql数据库

1.数据库技术发展 ODBC->DAO->RDO->ADOOLE DB   2.ADO中包含了七个对象成员          Connection用于管理数据库的连接  &...

使用VS2008 C++模块和ADO连接ORACLE上传下载BLOB图片

by xjsuez 2012年4月9日     最近做项目,使用oracle的BLOB保存大图片,将整理并测试成功的方法贴上来共享。     本人用平台是VS2008的C++模块,如果是VC的...
  • xjsuez
  • xjsuez
  • 2012-04-09 17:02
  • 1386
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)