题 阅读 评论 评论权限 操作 以前实习期间写的一段mfc编程,对数据库和xml格式文档的相关操作 主要相关代码 之五 导入xml格式文档数据到数据库

void CXMLwithSQLDlg::OnBnClickedCinput()
{
    m_list.DeleteAllItems();
    FieldsPtr fields;
    CString strColName;
    BSTR bstrColName;
    long ColCounti;
    _RecordsetPtr Rset;
    CFileException e;
    CString strFileName;
    try
    {
        Rset = m_ado.CreRecordset();
        HRESULT h = Rset->get_Fields(&fields);
        if(SUCCEEDED(h))
        {
            fields->get_Count(&ColCounti);
        }
        MSXML2::IXMLDOMDocumentPtr pDoc;
        MSXML2::IXMLDOMElementPtr xmlRoot;
        MSXML2::IXMLDOMElementPtr xmlNode;
        //创建DOMDocument对象
        HRESULT hr = pDoc.CreateInstance(_uuidof(MSXML2::DOMDocument30));
        if(!SUCCEEDED(hr))
        {
            MessageBox("Error");
            return;
        }
        //读取xml格式路径选择字符串
        CFileDialog FileLog(TRUE,"xml",NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,"xml(*.xml)|*.xml|所有文件(*.*)|*.*||",NULL);

        if(FileLog.DoModal() == IDOK)
        {
            strFileName = FileLog.GetFileName();
        }
        //加载xml文档
        pDoc->load((char*)(_bstr_t)strFileName);
        xmlRoot = pDoc->GetdocumentElement();
        MSXML2::IXMLDOMNodeListPtr nodeList = NULL;
        MSXML2::IXMLDOMNodePtr pAttrItem;
        xmlRoot->get_childNodes(&nodeList);
        long iCount;
        nodeList->get_length(&iCount);
        /*解析xml文档并把数据添加到数据库中*/
        for(int t = 0;t < iCount/11;t++)
        {
            long i = 0;
            Rset->AddNew();
            VARIANT varval;
            fields->Item[i]->get_Name(&bstrColName);
            nodeList->get_item(0+t*11,&pAttrItem);
            pAttrItem->get_nodeTypedValue(&varval);
            CString strValue = (char*)(_bstr_t) varval;
            //添加数据到数据库
            Rset->PutCollect(bstrColName, _variant_t (strValue));
            i++;
            ///
            nodeList->get_item(1+t*11, &pAttrItem);
            MSXML2::IXMLDOMNodeListPtr nodeList1 = NULL;
            MSXML2::IXMLDOMNodePtr pAttrItem1;
            pAttrItem->get_childNodes(&nodeList1);
            long iCount1;
            nodeList1->get_length(&iCount1);
            for(int j = 0;j < iCount1;j++)
            {
                fields->Item[i]->get_Name(&bstrColName);
                nodeList1->get_item(j, &pAttrItem1);
                pAttrItem1->get_nodeTypedValue(&varval);
                CString strValue1 = (char*)(_bstr_t) varval;
                Rset->PutCollect(bstrColName, _variant_t (strValue1));
                i++;
            }
            ///
            nodeList->get_item(2+t*11, &pAttrItem);
            MSXML2::IXMLDOMNodeListPtr nodeList2 = NULL;
            //单个节点集合
            MSXML2::IXMLDOMNodePtr pAttrItem2;
            //创建节点列表
            pAttrItem->get_childNodes(&nodeList2);
            long iCount2;
            nodeList2->get_length(&iCount2);
            for(int m = 0;m < iCount2;m++)
            {
                fields->Item[i]->get_Name(&bstrColName);
                nodeList2->get_item(m, &pAttrItem2);
                pAttrItem2->get_nodeTypedValue(&varval);
                CString strValue2= (char*)(_bstr_t) varval;
                Rset->PutCollect(bstrColName, _variant_t (strValue2));
                i++;
            }
            //
            for(int n = 3+t*11;n < 11+t*11;n++)
            {
                fields->Item[i]->get_Name(&bstrColName);
                nodeList->get_item(n, &pAttrItem);
                pAttrItem->get_nodeTypedValue(&varval);
                CString strValue3 = (char*)(_bstr_t) varval;
                Rset->PutCollect(bstrColName, _variant_t (strValue3));
                i++;
            }
            //更新数据库
            Rset->Update();
        }    
        AfxMessageBox("导入成功");
        pDoc.Release();//释放内存
    }
    catch(_com_error e)
    {
        e.Description();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值