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 关于#hadoop#的问题
  • ¥15 (标签-Python|关键词-socket)
  • ¥15 keil里为什么main.c定义的函数在it.c调用不了
  • ¥50 切换TabTip键盘的输入法
  • ¥15 可否在不同线程中调用封装数据库操作的类
  • ¥15 微带串馈天线阵列每个阵元宽度计算
  • ¥15 keil的map文件中Image component sizes各项意思
  • ¥20 求个正点原子stm32f407开发版的贪吃蛇游戏
  • ¥15 划分vlan后,链路不通了?
  • ¥20 求各位懂行的人,注册表能不能看到usb使用得具体信息,干了什么,传输了什么数据