koalayan66 2013-12-08 05:20 采纳率: 0%
浏览 1182

关于MFC从SQL Server 2008向DB2导数据的问题!

目前刚接触这些东西,憋得脑袋都大了。 ~~~导师都下催命书了...T_T

描述:两台服务器,一台是SQL,一台是DB2,把SQL中的一个表的数据导入DB2中已经建好的一张表中。我建了两个数据库类,一个是CSQL,一个是CDB2。

CDB2类代码:
void CDB2::OnInitDB2Conn()
{
::CoInitialize(NULL);

m_pConnection.CreateInstance(__uuidof(Connection)); 
_bstr_t strConn = "Provider=IBMDADB2.DB2COPY1;Persist Security Info=False;User ID=db2admin;Data Source=BSMPWS1;Location="";Extended Properties=""";
m_pConnection->Open(strConn,"db2admin","db2admin",adModeUnknown);

}

_RecordsetPtr & CDB2::GetRecordSet(_bstr_t strSQL)
{
if(m_pConnection == NULL)
OnInitDB2Conn();

m_pRecordset.CreateInstance(__uuidof(Recordset));    //初始化Recordset指针
m_pRecordset->Open(strSQL,m_pConnection.GetInterfacePtr(), adOpenDynamic,adLockOptimistic,adCmdText);
return m_pRecordset;

}

BOOL CDB2::ExecuteSQL(_bstr_t strSQL)

{

_variant_t RecordsAffected;

if(m_pConnection==NULL)

OnInitDB2Conn();

m_pConnection->Execute(strSQL,NULL,adCmdText);
return true;

}

CSQL类同上

Dlg类中导数据部分:
void CDatabaseDlg::OnBtnCopy()
{
CSQL sqlCopy;
sqlCopy.OnInitSQLConn();
CDB2 db2Copy;
db2Copy.OnInitDB2Conn();

_bstr_t DB2_delete = "delete * from bs_info_gather";  //清空DB2数据库表中的数据
db2Copy.ExecuteSQL(DB2_delete);

_bstr_t SQL_AGENCY = "select * from bs_agency";   
_RecordsetPtr  agency_pRecordset;            
agency_pRecordset = sqlCopy.GetRecordSet(SQL_AGENCY);  //打开并获取SQL的bs_agency记录集

_bstr_t DB2_AGENCY = "select * from bs_info_gather"; 
_RecordsetPtr db2_pRecordset;
db2_pRecordset = db2Copy.GetRecordSet(DB2_AGENCY);   //打开并获取DB2数据集
try
{       
    while(agency_pRecordset->adoEOF==0) 
    {
        db2_pRecordset->AddNew();   ##############################1

        //将SQL中AGENCY_TITLE字段数据传到DB2中BS_TITLE里
        _bstr_t an1 = agency_pRecordset->GetCollect("AGENCY_TITLE");
        db2_pRecordset->PutCollect("BS_TITLE",an1); 

        _bstr_t an2 = agency_pRecordset->GetCollect("AGENCY_CONTENT");
        db2_pRecordset->PutCollect("BS_CONTENT",an2);
         ... ...

        db2_pRecordset->MoveNext();
    }
    db2_pRecordset->Update();   
}
 .....

}
调试时在########1处抛出“当前记录集不支持更新。这可能是提供程序的限制,也可能是选定锁定类型的限制。”麻烦帮我分析分析哪里出问题了。

  • 写回答

1条回答

  • ChatGPTᴼᴾᴱᴺᴬᴵ 2023-02-26 17:27
    关注

    该回答引用ChatGPT

    根据你提供的信息,问题可能出在以下几个方面:

    • 数据库权限问题:请确保在DB2数据库中,当前用户有足够的权限来对表进行修改和更新操作。
    • 记录集类型问题:请确认db2_pRecordset对象的类型是可更新的记录集,如果不是可更新记录集,就不能使用AddNew()和Update()方法。
    • 锁定类型问题:请确认你在打开记录集的时候使用了正确的锁定类型。如果使用了只读的锁定类型,则不能对记录集进行更新操作。建议使用adLockOptimistic锁定类型,它可以支持并发更新操作。

    针对第二个问题,可以修改代码中的记录集打开方式,指定为可更新的记录集,例如:

    _bstr_t DB2_AGENCY = "select * from bs_info_gather";
    _RecordsetPtr db2_pRecordset;
    db2_pRecordset = db2Copy.GetRecordSet(DB2_AGENCY, adOpenKeyset, adLockOptimistic);
    

    需要在CDB2类中添加一个新的GetRecordSet函数,以便传入新的记录集类型和锁定类型参数:

    _RecordsetPtr & CDB2::GetRecordSet(_bstr_t strSQL, CursorTypeEnum cursorType, LockTypeEnum lockType)
    {
        if(m_pConnection == NULL)
            OnInitDB2Conn();
    
        m_pRecordset.CreateInstance(__uuidof(Recordset));
        m_pRecordset->Open(strSQL, m_pConnection.GetInterfacePtr(), cursorType, lockType, adCmdText);
    
        return m_pRecordset;
    }
    

    在导数据的循环中,使用AddNew()方法添加新记录前,需要先调用MoveNext()方法将记录集指针移动到下一个空白记录位置。这个步骤是必要的,否则会在第一次循环时导致向记录集中写入重复的记录。


    最后,需要调用Update()方法将修改的记录保存到DB2数据库中,例如:

    db2_pRecordset->Update();
    

    希望以上信息能够帮助你解决问题。

    评论

报告相同问题?

悬赏问题

  • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
  • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝
  • ¥20 腾讯企业邮箱邮件可以恢复么
  • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?
  • ¥15 错误 LNK2001 无法解析的外部符号
  • ¥50 安装pyaudiokits失败
  • ¥15 计组这些题应该咋做呀
  • ¥60 更换迈创SOL6M4AE卡的时候,驱动要重新装才能使用,怎么解决?
  • ¥15 让node服务器有自动加载文件的功能
  • ¥15 jmeter脚本回放有的是对的有的是错的