我是菜鸟,在这个开发中遇到了问题,请各位路人帮帮忙,解决一下,谢谢。
我的系统是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());
}
我的系统是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());
}
(LPCTSTR)m_strConnection, //连接字符串
adOpenKeyset, //设置游标类型
adLockReadOnly, //设置锁定类型
adCmdTableDirect); //设置命令类型你都自己设定为 adLockReadOnly了,还怎么更新阿?改为adLockOptimistic吧
---------------------------------------------
字段定义长度小于插入的数据长度。
我在表中DeviceID 是char(类型), 10(长度)
GpsInfo 是char , 31
这里我把 char device[10];
char info[31];
应该没有问题啊。
::AfxOleInit();
直接提示错误。添加::CoInitialize(NULL);问题还是一样。
添加记录还是用m_pRs->PutCollect("DeviceID",_variant_t(device));好
不能这么改,提示(server_gps_data为一个表名)。
或者你先用 _ConnectionPtr 连接数据库,再用 _RecordsetPtr 查询数据集吧
_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)
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")); ”代替
则可以正常写入表中,我看可能是字符长度或着是类型问题引起的。但一直没有找的错误的地方。
应该是:
我现在把原来的 :
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));这里有问题,但没看出哪里有问题。请大家看看。
谢谢了。
m_pRs->PutCollect("DeviceID", _variant_t(device)); //这个有问题?
-----
检查device的值
char info[31];
应该没有问题啊。
应该定义为 char device[11]; char info[32].要多一个字符长度,因为有终止符'\0'
但问题又出来了,在表中的的DeviceID的值变成"0505000001烫琄7",而GpsInfo的值为空的,什么都没有. 调试过程中发现后面是有些乱码的.在memcpy(device, (char *)DeviceItem.m_DeviceID, 10*sizeof(char));时,DeviceItem.m_DeviceID的值是正常的.但device就有乱码.我想应该是字符串没有用'0'结束的问题.不知道该怎么改呢
memcpy(device, (char *)DeviceItem.m_DeviceID, 10*sizeof(char));
device[11] = 0; //结束字符串
但GpsInfo为一个看不到的空值.是不是因为buff原来为一个byte的类型,调试这个结果为255,把他变为char后,Info这个结果会有些乱码.所以在结果中才有这种情况.
BYTE b = 255;
sprintf(a, "%d", b);