MFC数据库删除和修改数据失败

时间:2022-06-04 07:27:52
使用list ctrl控件,绑定为m_Grid


int pos   = m_Grid.GetSelectionMark();
ADO m_Ado;
m_Ado.OnInitADOConn();
CString sql = "select * from jobs";
m_Ado.m_pRecordset = m_Ado.OpenRecordset(sql);
try
{
m_Ado.m_pRecordset->Move(pos,vtMissing);
m_Ado.m_pRecordset->Delete(adAffectCurrent);
m_Ado.m_pRecordset->Update();
m_Ado.CloseRecordset();
m_Ado.CloseConn();
}
catch(...)
{
MessageBox("操作失败");
return;
}

这段是删除的,每次执行都是跳出失败提示。
下一段修改数据的,也是失败,仅仅是添加数据 能成功。
UpdateData(TRUE);
if(m_id.IsEmpty() || m_desc.IsEmpty() || m_slvl.IsEmpty())
{
MessageBox("基础信息不能为空!");
return;
}
int pos   = m_Grid.GetSelectionMark();
ADO m_Ado;
m_Ado.OnInitADOConn();
CString sql = "select * from jobs";
m_Ado.m_pRecordset = m_Ado.OpenRecordset(sql);
try
{
m_Ado.m_pRecordset->Move((long)pos,vtMissing);
m_Ado.m_pRecordset->PutCollect("job_id",(_bstr_t)m_id);
m_Ado.m_pRecordset->PutCollect("job_desc",(_bstr_t)m_desc);
m_Ado.m_pRecordset->PutCollect("min_lvl",(_bstr_t)m_slvl);
m_Ado.m_pRecordset->PutCollect("max_lvl",(_bstr_t)m_llvl);
m_Ado.m_pRecordset->Update();
m_Ado.CloseRecordset();
m_Ado.CloseConn();
}
catch(...)
{
MessageBox("操作失败");
return;
}

5 个解决方案

#1


异常捕获改成这样试试看什么错误。
try
{
//你的ADO代码
}
catch (_com_error& e)
{
CString strMsg;
strMsg.Format(_T("错误描述:%s\n错误消息%s"), 
(LPCTSTR)e.Description(),
(LPCTSTR)e.ErrorMessage());
AfxMessageBox(strMsg);
}

#2


1、确认连接建立正常。
2、确认SQL执行正确,并且记录集中有相应的记录。
3、确认操作的字段名称正确无误。
4、如果上述3处都没有问题的话,有可能跟你创建的记录集的类型有关,记录集有多种类型,每种类型的记录集对增删改等操作的支持是不一样的。
你可以看一个msdn中关于记录集类型的描述中对几种类型的秒,以便创建正确类型的记录集。

#3


1、   AdOpenForwardOnly   (默认值)一次只能向前移动一行。 
2、   AdOpenKeyset   打开键集类型游标。 
3、   AdOpenDynamic   打开动态类型游标 
4、   AdOpenStatic   打开静态类型游标。 
AdOpenForwardOnly和AdOpenStatic这两种游标使得记录集只读,它表示创建数据的一个快照。后者比前者灵活,因为它可以允许任意方向移动。 
AdOpenKeyset允许任意移动,并且允许更改记录集。其他用户对记录集的添加和删除,这个游标反映不出来。但它能反映出其他用户对记录集的更改。 
AdOpenDynamic允许所有操作,其他用户对记录集的添加、删除、更改在此记录集中 
都是可见的。 
AdLockReadOnly   (默认值)只读   ---   不能改变数据。 
AdLockPessimistic   悲观锁(逐个)---   为确保成功完成编辑记录所需的工作, 
在编辑时立即锁定数据源的记录。 
AdLockOptimistic   乐观锁(逐个)---   只在调用Update   方法时才锁定记录。 
AdLockBatchOptimistic   乐观批更新---用于批更新模式(与立即更新模式相对)。

在网上搜了些关于记录集类型的介绍,看看是否对你有用!

#4


感觉不是类型错误就是下标越界,类型错误可能多些

你跟跟看,到哪出的错,也有个别字段根据不同的数据库可能会有冲突

#5


引用 3 楼 LittleCommit 的回复:
1、   AdOpenForwardOnly   (默认值)一次只能向前移动一行。 
2、   AdOpenKeyset   打开键集类型游标。 
3、   AdOpenDynamic   打开动态类型游标 
4、   AdOpenStatic   打开静态类型游标。 
AdOpenForwardOnly和AdOpenStatic这两种游标使得记录集只读,它表示创建数据的一个快照。后者比前者灵活,因为它可以允许任意方向移动。 
AdOpenKeyset允许任意移动,并且允许更改记录集。其他用户对记录集的添加和删除,这个游标反映不出来。但它能反映出其他用户对记录集的更改。 
AdOpenDynamic允许所有操作,其他用户对记录集的添加、删除、更改在此记录集中 
都是可见的。 
AdLockReadOnly   (默认值)只读   ---   不能改变数据。 
AdLockPessimistic   悲观锁(逐个)---   为确保成功完成编辑记录所需的工作, 
在编辑时立即锁定数据源的记录。 
AdLockOptimistic   乐观锁(逐个)---   只在调用Update   方法时才锁定记录。 
AdLockBatchOptimistic   乐观批更新---用于批更新模式(与立即更新模式相对)。

在网上搜了些关于记录集类型的介绍,看看是否对你有用!

mark

#1


异常捕获改成这样试试看什么错误。
try
{
//你的ADO代码
}
catch (_com_error& e)
{
CString strMsg;
strMsg.Format(_T("错误描述:%s\n错误消息%s"), 
(LPCTSTR)e.Description(),
(LPCTSTR)e.ErrorMessage());
AfxMessageBox(strMsg);
}

#2


1、确认连接建立正常。
2、确认SQL执行正确,并且记录集中有相应的记录。
3、确认操作的字段名称正确无误。
4、如果上述3处都没有问题的话,有可能跟你创建的记录集的类型有关,记录集有多种类型,每种类型的记录集对增删改等操作的支持是不一样的。
你可以看一个msdn中关于记录集类型的描述中对几种类型的秒,以便创建正确类型的记录集。

#3


1、   AdOpenForwardOnly   (默认值)一次只能向前移动一行。 
2、   AdOpenKeyset   打开键集类型游标。 
3、   AdOpenDynamic   打开动态类型游标 
4、   AdOpenStatic   打开静态类型游标。 
AdOpenForwardOnly和AdOpenStatic这两种游标使得记录集只读,它表示创建数据的一个快照。后者比前者灵活,因为它可以允许任意方向移动。 
AdOpenKeyset允许任意移动,并且允许更改记录集。其他用户对记录集的添加和删除,这个游标反映不出来。但它能反映出其他用户对记录集的更改。 
AdOpenDynamic允许所有操作,其他用户对记录集的添加、删除、更改在此记录集中 
都是可见的。 
AdLockReadOnly   (默认值)只读   ---   不能改变数据。 
AdLockPessimistic   悲观锁(逐个)---   为确保成功完成编辑记录所需的工作, 
在编辑时立即锁定数据源的记录。 
AdLockOptimistic   乐观锁(逐个)---   只在调用Update   方法时才锁定记录。 
AdLockBatchOptimistic   乐观批更新---用于批更新模式(与立即更新模式相对)。

在网上搜了些关于记录集类型的介绍,看看是否对你有用!

#4


感觉不是类型错误就是下标越界,类型错误可能多些

你跟跟看,到哪出的错,也有个别字段根据不同的数据库可能会有冲突

#5


引用 3 楼 LittleCommit 的回复:
1、   AdOpenForwardOnly   (默认值)一次只能向前移动一行。 
2、   AdOpenKeyset   打开键集类型游标。 
3、   AdOpenDynamic   打开动态类型游标 
4、   AdOpenStatic   打开静态类型游标。 
AdOpenForwardOnly和AdOpenStatic这两种游标使得记录集只读,它表示创建数据的一个快照。后者比前者灵活,因为它可以允许任意方向移动。 
AdOpenKeyset允许任意移动,并且允许更改记录集。其他用户对记录集的添加和删除,这个游标反映不出来。但它能反映出其他用户对记录集的更改。 
AdOpenDynamic允许所有操作,其他用户对记录集的添加、删除、更改在此记录集中 
都是可见的。 
AdLockReadOnly   (默认值)只读   ---   不能改变数据。 
AdLockPessimistic   悲观锁(逐个)---   为确保成功完成编辑记录所需的工作, 
在编辑时立即锁定数据源的记录。 
AdLockOptimistic   乐观锁(逐个)---   只在调用Update   方法时才锁定记录。 
AdLockBatchOptimistic   乐观批更新---用于批更新模式(与立即更新模式相对)。

在网上搜了些关于记录集类型的介绍,看看是否对你有用!

mark