说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

关于VC中使用ADO进行事务处理BeginTrans()的问题,很奇怪。(内有代码,非常疑惑!求助)

编辑:说三道四文库 发布时间:2018-01-16 11:18
HTML文档下载 WORD文档下载 PDF文档下载
在VC中使用ADO 2.6的版本进行事务处理的时候,结果出现如下情况:
不管是提交事务也好,还是回滚事务也好,在事务中对数据表的处理结果都发生了改变。  然而。同样的流程,在VB程序中就不存在问题,具体代码如下:
 
         m_pRecordset->LockType = adLockOptimistic;
m_pRecordset->CursorType = adOpenDynamic;
m_pRecordset->CursorLocation = adUseServer;


m_pRecordset->Open(strSource, source, adOpenDynamic,
adLockOptimistic, adCmdText);

m_pConnection->BeginTrans();

for(i =1; i<=5; i++)
{
str.Format("%d", i);
m_pRecordset->AddNew();

vIndex = (short)0;
m_pRecordset->PutCollect(&vIndex, _variant_t(str 
                                                              + "_YOU"));

vIndex = (short)1;
m_pRecordset->PutCollect(&vIndex, _variant_t(str 
                                                               + "_I"));

vIndex = (short)2;
m_pRecordset->PutCollect(&vIndex, _variant_t(str 
                                                               + "_HE"));

m_pRecordset->Update();
}

if(MessageBox("是否完成修改?", NULL, MB_ICONQUESTION | MB_YESNO)
== IDYES)
{
m_pConnection->CommitTrans();
}
else
{
m_pConnection->RollbackTrans();
}
代码执行完毕后,如果执行RollbackTrans(),数据库的Update操作并没有被取消,而是将数据添加进了数据库中。  同样的流程,在VB代码中就没有问题,如下:
    cnn.ConnectionString = Adodc1.ConnectionString
    cnn.CursorLocation = adUseServer
    cnn.Open
    
    Set comm.ActiveConnection = cnn
    comm.CommandText = "select * from uCoursesTeacher"
    comm.CommandType = adCmdText
    
    Set rs = comm.Execute
    rs.Close
    rs.LockType = adLockOptimistic
    rs.Open

    cnn.BeginTrans
    
    'rs.MoveFirst
    Dim i As Integer
    For i = 1 To 5
        rs.AddNew
        rs(0) = i & "_YOU"
        rs(1) = i & "_I"
        rs(2) = i & "_He"
        rs.Update
    Next i
   
    If vbYes = MsgBox("是否保存修改?", vbYesNo + vbQuestion) Then
           cnn.CommitTrans
    Else
        cnn.RollbackTrans
    End If
    
这个问题使得我很困惑,希望能得到高手的指点。
程序编写的环境是VC 6.0 + SP5  + Win2k server

谢谢。
你对Connection对象的属性做了必要的设置没?
connection对象需要那些必要的设置呀?
我的connection对象在初始化的时候设置如下:
  hr = m_pConnection.CreateInstance(_uuidof(Connection));
  if(SUCCEEDED(hr))
  {
m_pConnection->CursorLocation = adUseServer;
hr = m_pConnection->Open(strConn, "", "", 
                                        adConnectUnspecified);
   }
仅仅把CursorLocation设置为了adUseServer。 还需要进行其他的设置吗??
今天看来我运气不好,这么久都没有人给出正确的解答。
我VC水平有限,不过既然在VB里面同样的流程能够实现预期的效果,那么为何在VC里面居然不行呢?
我非常困惑,真的希望高手能给出解答。

难道是我对COM\OLE的环境初始化除错吗?但是其他的ADO语句照样执行正确呀。

迫切希望高手的指点,谢谢。
谢谢诸位,我自己搞定了。
在Open一个Recordset的时候,不能传递字符串进去,而是用Connection对象的指针作为
Open的第二个参数,即可实现事务。

这个帖子只有一个兄弟关注,我该如何给分呢?

自己解决了问题,给自己分数行吗?呵呵
HCC 2013虚拟化论坛:虚拟化未来发展方向 Windows 8操作系统市场份额增至7.41% Windows 7仍最受欢迎 【开源专访】Sea.js创始人玉伯的前端开发之路 SDCC 2013:阿里周宝方谈“去IOE”战略及实施 百度和高德:最后谁是地图的王者? C++ Builder 6+MYSQL的问题! 58293DED 这是一个16进制的日期,问题我应该如何得到它的日期值呢 数据库备份问题 如何在sqlplus中插入一个多行内容的字符串? 怎样才可以判断WEB服务器的死,活状态啊?除了ping以外?? 急求语法分析器! 在线等,怎么给ListBox选择项前加一个checkbox,以便用户选择,立即给分!!! 如何获得页面上动态生成的控件数据组对象 如何得到一个无限趋近于0的数值? 如图 正方形的边长为a cm,求阴影部分面积 如图,正方形的边长为a,求图中阴影部分的面积 如图2,正方形的边长为A,若图形中阴影部分面积为S 若四边形ABCD为正方形,则图中阴影部分的面积为( 如下图所示,四边形abcd和四边形cefg是两个大 正方形ABCD和正方形EFGB中EF=6厘米,阴影 如图2,设每个小正方形的面积均为1,则图中阴影正方 如图已知正方形的边长为a,求阴影部分的面积,答得好 如图,由两个正方形组成,其中小正方形的边长为a,求 经济学家对中国未来十年贫富差距走势分世界前政要感受中共改革雄心老牌肌肉男星上演\"金蝉脱壳\"史泰全国物理竞赛浙江拿下7块金牌 杭二中新消法:回避\"知假买假\" \"假上交所发出30多份 事后监管问询函长征精神引领红色老区奔小康 重庆精准中国福利彩票“双色球”把思想和行动统一到 中央要求和部署上增强信心 推动合作 促进改革游戏开发巨头末世恐慌唐冢天下第一王牌大明星怪石峪旅游圣母堂旅游小龙池旅游天意谷旅游万盛石林旅游
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘