100分请教ado 的AddNew问题,十万火急!

时间:2021-08-29 20:39:50
程序段如下:
_RecordsetPtr pRs;
_ConnectionPtr pConn;
CCSActionRecordset OSet;

try{
pRs.CreateInstance(__uuidof(Recordset));


pConn.CreateInstance(__uuidof(Connection));
pConn->Open((LPTSTR)(LPCTSTR)szConn, _T(""), _T(""), -1);
break;
CString strSQL;

pConn->BeginTrans();
pRs->Open(_T("csAction"), _variant_t((LPDISPATCH)pConn), adOpenKeyset, adLockPessimistic, adCmdTable);
pRs->AddNew();
pRs->Fields->GetItem(_T("cCreateStaffName"))->Value = _variant_t((LPTSTR)(LPCTSTR)m_TempRecord.strCreateStaffName);
pRs->Fields->GetItem(_T("iCreateOrgID"))->Value = m_TempRecord.nCreateOrgID;
pRs->Fields->GetItem(_T("cActionNumber"))->Value = _variant_t((LPTSTR)(LPCTSTR)m_TempRecord.strNumber);
pRs->Fields->GetItem(_T("cActionPriority"))->Value = _variant_t((LPTSTR)(LPCTSTR)m_TempRecord.strPriority);
pRs->Fields->GetItem(_T("cActionLinkman"))->Value = _variant_t((LPTSTR)(LPCTSTR)m_TempRecord.strLinkman);
pRs->Fields->GetItem(_T("cActionCustomer"))->Value = _variant_t((LPTSTR)(LPCTSTR)m_TempRecord.strClient);
pRs->Fields->GetItem(_T("cActionOpp"))->Value = _variant_t((LPTSTR)(LPCTSTR)m_TempRecord.strOpp);
pRs->Fields->GetItem(_T("cActionName"))->Value = _variant_t((LPTSTR)(LPCTSTR)m_TempRecord.strName);
pRs->Fields->GetItem(_T("cActionDetails"))->Value = _variant_t((LPTSTR)(LPCTSTR)m_TempRecord.strDetails);

pRs->Fields->GetItem(_T("iActionTypeID"))->Value = m_TempRecord.nTypeID;
pRs->Fields->GetItem(_T("iActionClassID"))->Value = m_TempRecord.nClassID;
pRs->Fields->GetItem(_T("iActionDoneStaffID"))->Value = m_TempRecord.nDoneStaffID;
pRs->Fields->GetItem(_T("iActionAlarm"))->Value = m_TempRecord.nAlarm;
pRs->Fields->GetItem(_T("dDateActionStart"))->Value = m_TempRecord.dDateStart;
if(m_TempRecord.dDateEnd > 0)
    pRs->Fields->GetItem(_T("dDateActionEnd"))->Value = m_TempRecord.dDateEnd;

pRs->Update();
// 问题在这里!!!!!auActionID为自动增值ID
m_TempRecord.nID = pRs->Fields->GetItem(_T("auActionID"))->Value;
//为什么取出的ID值是零?我在别的程序上也同样方式的操作,但能取出新增后的自动ID
pRs->Close();
pConn->CommitTrans();

pConn->Close();
pConn.Release();
}
catch(_com_error &e)
{
CString strError;
if((LPTSTR)e.Description() != NULL)
{
strError = (LPTSTR)e.Description();
}
else
{
strError = e.ErrorMessage();
}
::AfxMessageBox(strError);
return FALSE;
}

14 个解决方案

#1


用GetCollect,PutCollect

#2


怎么用?

#3


在ADO里你自己写SQL语句不就完了,还用什么ADDNEW,UPDATE,多此几举呀

#4


EetyChen(三刀主)请看清楚问题在哪里,
上面的代码我执行是无错误的,数据也写进数据库了。问题是Update以后我要马上得到为自动增值ID的auActionID字段的值,但一直返回的是“0“
还有,我在操作别的数据表时也是用同样ADDNEW的方法也新加记录,但能马上得出自动增值ID的值。
再说,我想如果用INSERT SQL语句如果有一些字段的数据量比较大我怕用字符串会出问题。

其实,这问题我昨晚奋战了1个多小时终于解决了已经知道。但现在分数既然给了,我就想把分给能解决或解释这问题的人。

#5


代码质量太差,很难看,有没有一点职业习惯啊?

#6


pConn->CommitTrans()应该在你重新取值之前嘛,不然数据库中表的相关字段都已经给"锁"上了(一般数据库系统是这样处理并发问题的),怎么能取出正常的值呢?!
是不是这样解释和解决的?!

#7


After you call the BeginTrans method, the provider will no longer instantaneously commit changes you make until you call CommitTrans or RollbackTrans to end the transaction.
明白?其实和 EetyChen(三刀主) 说的一样

#8


NO NO NO
我正是这样试过,反而在取值时出现exception呢。

#9


GZ

#10


这个问题我遇到过,因为这个当id为自增型时,数据库的ado连接重新连接一次,问题就ok了。
具体的东西忘记了,大概就是这样的了

#11


呵呵,也不对啊~~~~,其实,如果解决了这个问题的话,会有好大的便利的,因为,假设添加了csAction(名为行动主题)的一条记录后,然后需要紧跟着添加一条行动汇报记录(csActionReport),多条行动汇可以报是属于一条行动主题记录的,也就是说csActionReport里有一个字段iActionID是指向csAction的auActionID,那在上面的代码中能马上得出auActionID的值就不用再Query数据库一遍罗。而且Query也不好做,万一在这时候另一个人又添加了一条csAction的记录,那怎么办?

#12


在大多数已经实现的数据库系统里你不用考虑"万一在这时候另一个人又添加了一条csAction的记录"该怎么办,因为数据库厂商在其系统实现中,对并发访问的处理往往采用的是在Transact...CommitTrans之间锁定某几条记录而非锁定你所Access的那个表.使用数据库作开发,你只要理解它实现的方式和使用它的规则,其它的事你可以把它们全想象成 Transparent!
关注!

#13


那么,照EetyChen(三刀主)大兄说,那么在事务中,如果我新Addnew了一条记录,然后再Select top 1 auActionID from csAction order by auActionID desc ,即使在这期间有别的人又新加了一条记录,但我所Query的还是我Addnew的那条记录的ID吧,对吗?

#14


好了,我还是不要浪费大家的时间了,我说说解决方法吧。

其实上面的代段是正确的,确实能马上得到auActionID的值,只要在数据库时把auActionID设成主键字就行了。至于为什么可以这样,我就不清楚了.

#1


用GetCollect,PutCollect

#2


怎么用?

#3


在ADO里你自己写SQL语句不就完了,还用什么ADDNEW,UPDATE,多此几举呀

#4


EetyChen(三刀主)请看清楚问题在哪里,
上面的代码我执行是无错误的,数据也写进数据库了。问题是Update以后我要马上得到为自动增值ID的auActionID字段的值,但一直返回的是“0“
还有,我在操作别的数据表时也是用同样ADDNEW的方法也新加记录,但能马上得出自动增值ID的值。
再说,我想如果用INSERT SQL语句如果有一些字段的数据量比较大我怕用字符串会出问题。

其实,这问题我昨晚奋战了1个多小时终于解决了已经知道。但现在分数既然给了,我就想把分给能解决或解释这问题的人。

#5


代码质量太差,很难看,有没有一点职业习惯啊?

#6


pConn->CommitTrans()应该在你重新取值之前嘛,不然数据库中表的相关字段都已经给"锁"上了(一般数据库系统是这样处理并发问题的),怎么能取出正常的值呢?!
是不是这样解释和解决的?!

#7


After you call the BeginTrans method, the provider will no longer instantaneously commit changes you make until you call CommitTrans or RollbackTrans to end the transaction.
明白?其实和 EetyChen(三刀主) 说的一样

#8


NO NO NO
我正是这样试过,反而在取值时出现exception呢。

#9


GZ

#10


这个问题我遇到过,因为这个当id为自增型时,数据库的ado连接重新连接一次,问题就ok了。
具体的东西忘记了,大概就是这样的了

#11


呵呵,也不对啊~~~~,其实,如果解决了这个问题的话,会有好大的便利的,因为,假设添加了csAction(名为行动主题)的一条记录后,然后需要紧跟着添加一条行动汇报记录(csActionReport),多条行动汇可以报是属于一条行动主题记录的,也就是说csActionReport里有一个字段iActionID是指向csAction的auActionID,那在上面的代码中能马上得出auActionID的值就不用再Query数据库一遍罗。而且Query也不好做,万一在这时候另一个人又添加了一条csAction的记录,那怎么办?

#12


在大多数已经实现的数据库系统里你不用考虑"万一在这时候另一个人又添加了一条csAction的记录"该怎么办,因为数据库厂商在其系统实现中,对并发访问的处理往往采用的是在Transact...CommitTrans之间锁定某几条记录而非锁定你所Access的那个表.使用数据库作开发,你只要理解它实现的方式和使用它的规则,其它的事你可以把它们全想象成 Transparent!
关注!

#13


那么,照EetyChen(三刀主)大兄说,那么在事务中,如果我新Addnew了一条记录,然后再Select top 1 auActionID from csAction order by auActionID desc ,即使在这期间有别的人又新加了一条记录,但我所Query的还是我Addnew的那条记录的ID吧,对吗?

#14


好了,我还是不要浪费大家的时间了,我说说解决方法吧。

其实上面的代段是正确的,确实能马上得到auActionID的值,只要在数据库时把auActionID设成主键字就行了。至于为什么可以这样,我就不清楚了.