_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个多小时终于解决了已经知道。但现在分数既然给了,我就想把分给能解决或解释这问题的人。
上面的代码我执行是无错误的,数据也写进数据库了。问题是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(三刀主) 说的一样
明白?其实和 EetyChen(三刀主) 说的一样
#8
NO NO NO
我正是这样试过,反而在取值时出现exception呢。
我正是这样试过,反而在取值时出现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设成主键字就行了。至于为什么可以这样,我就不清楚了.
其实上面的代段是正确的,确实能马上得到auActionID的值,只要在数据库时把auActionID设成主键字就行了。至于为什么可以这样,我就不清楚了.
#1
用GetCollect,PutCollect
#2
怎么用?
#3
在ADO里你自己写SQL语句不就完了,还用什么ADDNEW,UPDATE,多此几举呀
#4
EetyChen(三刀主)请看清楚问题在哪里,
上面的代码我执行是无错误的,数据也写进数据库了。问题是Update以后我要马上得到为自动增值ID的auActionID字段的值,但一直返回的是“0“
还有,我在操作别的数据表时也是用同样ADDNEW的方法也新加记录,但能马上得出自动增值ID的值。
再说,我想如果用INSERT SQL语句如果有一些字段的数据量比较大我怕用字符串会出问题。
其实,这问题我昨晚奋战了1个多小时终于解决了已经知道。但现在分数既然给了,我就想把分给能解决或解释这问题的人。
上面的代码我执行是无错误的,数据也写进数据库了。问题是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(三刀主) 说的一样
明白?其实和 EetyChen(三刀主) 说的一样
#8
NO NO NO
我正是这样试过,反而在取值时出现exception呢。
我正是这样试过,反而在取值时出现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设成主键字就行了。至于为什么可以这样,我就不清楚了.
其实上面的代段是正确的,确实能马上得到auActionID的值,只要在数据库时把auActionID设成主键字就行了。至于为什么可以这样,我就不清楚了.