我是菜鸟,在这个开发中遇到了问题,请各位路人帮帮忙,解决一下,谢谢。
   我的系统是windows server2003,vc++6.0,SQL Server2000,采用ADO方式。
   我想实现的是把不断变化的buff和device值添加到表server中的DeviceID和GpsInfo字段中.但是总是添加不了,不知是为什么,还不断提示"当前记录集不支持更新,这可能是提供程序的错误,也可能是选定锁定类型的限制"。反正添加不了值入表中,望大家看看。谢谢。1、我在头文件中添加了//define to Ado
#include "resource.h"  
// CG : In order to use this code against a different version of ADO, the appropriate
// ADO library needs to be used in the #import statement
#import "D:\Program Files\Common Files\system\ado\msado20.tlb" rename_namespace("ADOCG") rename("EOF", "EndOfFile")
using namespace ADOCG;
#include "icrsint.h"2、在cpp文件中
   
    ///////////////////////////////////////////////////////////////////////////    在CGPS_SERVERDlg::CGPS_SERVERDlg(CWnd* pParent /*=NULL*/)
       : CDialogCGPS_SERVERDlg::IDD, pParent)中添加了:
//定义连接字符串
m_strConnection = _T("Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;User ID=sqlserver;Initial Catalog=server_data;Data Source=(local)");

m_strCmdText = _T("server");  //定义命令文本内容 m_pRs = NULL;    ///////////////////////////////////////////////////////
    在CRDlg::OnInitDialog()中添加了:
     
     HRESULT hr = NOERROR;
IADORecordBinding *piAdoRecordBinding = NULL;    try{
   m_pRs.CreateInstance(__uuidof(Recordset)); //创建connection对象实例
       m_pRs->CursorLocation = adUseClient; //设置游标位置
   //打开记录集
   m_pRs->Open((LPCTSTR)m_strCmdText,  //命令文本内容
           (LPCTSTR)m_strConnection,  //连接字符串
   adOpenKeyset,          //设置游标类型
   adLockReadOnly,        //设置锁定类型
   adCmdTableDirect);     //设置命令类型
    
       //if (FAILED(hr = m_pRs->QueryInterface(__uuidof(IADORecordBinding), (LPVOID *)&piAdoRecordBinding)))
// _com_issue_error(hr);
  // if (FAILED(hr = piAdoRecordBinding->BindToRecordset(this)))
// _com_issue_error(hr);

}
catch (_com_error &e)
{
GenerateError(e.Error(), e.Description());
}
if (piAdoRecordBinding)
piAdoRecordBinding->Release();/////////////////////////////////////////////////////////////////////   在某一添加记录的函数中添加了:     char device[10];
    //BYTE  info[31];
    char info[31];
    memcpy(device, (char *)(DeviceItem.m_DeviceID), sizeof(DeviceItem.m_DeviceID));
    memcpy(info,buff,sizeof(buff)); m_pRs->AddNew(); 
         m_pRs->Fields->GetItem(_variant_t("DeviceID"))->Value=_bstr_t(device);
//m_pRs->PutCollect("DeviceID",_variant_t(device));

m_pRs->Fields->GetItem(_variant_t("GpsInfo"))->Value=_bstr_t(info);
//m_pRs->Fields->GetItem(_variant_t("GpsInfo"))->Value=_bstr_t(info);
         m_pRs->Update(); 
}catch(_com_error &e)
{
m_pRs->CancelUpdate();  //若错误则撤消
MessageBox(e.Description());
}

解决方案 »

  1.   

    m_pRs->Open((LPCTSTR)m_strCmdText,  //命令文本内容
               (LPCTSTR)m_strConnection,  //连接字符串
       adOpenKeyset,          //设置游标类型
       adLockReadOnly,        //设置锁定类型
       adCmdTableDirect);     //设置命令类型你都自己设定为 adLockReadOnly了,还怎么更新阿?改为adLockOptimistic吧
      

  2.   

    我基本上直接执行SQL语句. 使用Command对象, 或直接在Connect对象上执行.
      

  3.   

    SQL那个方法在这里不知大如何去用。
      

  4.   

    “多步操作产生错误,请检查每一步的状态值”。
    ---------------------------------------------
    字段定义长度小于插入的数据长度。
    我在表中DeviceID 是char(类型), 10(长度)
            GpsInfo  是char        , 31
    这里我把 char device[10];
             char info[31];
    应该没有问题啊。
      

  5.   

    有::CoInitialize(NULL);就不用AfxOleInit()
      

  6.   

    刚才在OnInitDialg()函数中添加
         ::AfxOleInit();
    直接提示错误。添加::CoInitialize(NULL);问题还是一样。
      

  7.   

    adCmdTableDirect改为adCmdText 
    添加记录还是用m_pRs->PutCollect("DeviceID",_variant_t(device));好
      

  8.   


    不能这么改,提示(server_gps_data为一个表名)。
      

  9.   

    你这种用法以前没见过,觉得有点别扭
    或者你先用    _ConnectionPtr 连接数据库,再用 _RecordsetPtr  查询数据集吧
      

  10.   

    // 添加一个指向Connection对象的指针
    _ConnectionPtr m_pConnection;
    //连接SQL Server数据库的字符串
    _bstr_t strConnect = "Provider=SQLOLEDB.1;Persist Security Info=True;User ID=sa;Password=123;Initial Catalog=mydb;Data Source=(local)";
    //执行数据连接
    m_pConnection->Open((_bstr_t)strConnectSQL,"","",adModeUnknown);
    //备注:在有变量参与时,记得用UpdateData(TRUE)/UpdateData(FALSE)
      

  11.   

    我现在把原来的 :
        m_pRs->Fields->GetItem(_variant_t("DeviceID"))->Value=_bstr_t(device);
        m_pRs->Fields->GetItem(_variant_t("GpsInfo"))->Value=_bstr_t(info);  改成了:
              m_pRs->Fields->GetItem(_variant_t("DeviceID"))->Value=_bstr_t(device);
              m_pRs->Fields->GetItem(_variant_t("GpsInfo"))->Value=_bstr_t(info); 还是不行。然后我把引掉了
              m_pRs->Fields->GetItem(_variant_t("DeviceID"))->Value=_bstr_t(device);
              m_pRs->Fields->GetItem(_variant_t("GpsInfo"))->Value=_bstr_t(info);
       这段,用“m_pRs->PutCollect("DeviceID", _variant_t("123"));  ”代替
           则可以正常写入表中,我看可能是字符长度或着是类型问题引起的。但一直没有找的错误的地方。
      

  12.   

    不好意思上面写错了。
    应该是:
      我现在把原来的 :
        m_pRs->Fields->GetItem(_variant_t("DeviceID"))->Value=_bstr_t(device);
        m_pRs->Fields->GetItem(_variant_t("GpsInfo"))->Value=_bstr_t(info);  改成了:
         m_pRs->PutCollect("DeviceID", _variant_t(device));
         m_pRs->PutCollect("GpsInfo",_variant_t(info));
              
     还是不行。然后我把引掉了
         m_pRs->PutCollect("DeviceID", _variant_t(device));
         m_pRs->PutCollect("GpsInfo",_variant_t(info));            这段,用“m_pRs->PutCollect("DeviceID", _variant_t("123"));  ”代替
           则可以正常写入表中,我看可能是字符长度或着是类型问题引起的。但一直没有找的错误的地方。
      
        
         我调试了一下,每次一到m_pRs->PutCollect("DeviceID", _variant_t(device));就跳到
    catch(_com_error &e)
    {
    m_pRs->CancelUpdate();  //若错误则撤消
    MessageBox(e.Description());
    }
    这段,应该是m_pRs->PutCollect("DeviceID", _variant_t(device));这里有问题,但没看出哪里有问题。请大家看看。
       谢谢了。
      

  13.   

    m_pRs->PutCollect("DeviceID", _variant_t("123"));  //这个可以
    m_pRs->PutCollect("DeviceID", _variant_t(device)); //这个有问题?
    -----
    检查device的值
      

  14.   

    这里我把 char device[10];
             char info[31];
    应该没有问题啊。
    应该定义为 char device[11]; char info[32].要多一个字符长度,因为有终止符'\0'
      

  15.   

    我把表里的长度变成把10变成15  31变成40,就没有问题了,
           但问题又出来了,在表中的的DeviceID的值变成"0505000001烫琄7",而GpsInfo的值为空的,什么都没有.       调试过程中发现后面是有些乱码的.在memcpy(device, (char *)DeviceItem.m_DeviceID, 10*sizeof(char));时,DeviceItem.m_DeviceID的值是正常的.但device就有乱码.我想应该是字符串没有用'0'结束的问题.不知道该怎么改呢
      

  16.   

    char device[11];
    memcpy(device, (char *)DeviceItem.m_DeviceID, 10*sizeof(char));
    device[11] = 0;  //结束字符串
      

  17.   

    改了char device[11];,结果DeviceID正确.
        但GpsInfo为一个看不到的空值.是不是因为buff原来为一个byte的类型,调试这个结果为255,把他变为char后,Info这个结果会有些乱码.所以在结果中才有这种情况.
      

  18.   

    char a[10];
    BYTE b = 255;
    sprintf(a, "%d", b);