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

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

编辑:说三道四文库 发布时间:2018-07-20 05:05
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的第二个参数,即可实现事务。

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

自己解决了问题,给自己分数行吗?呵呵
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘