2013-01-09 37 views
0

我目前正嘗試通過xml(在TemplateParser內調用inputFiles)將大量數據插入到我的存儲庫中。但是,如果單個記錄引發錯誤(如鍵約束),則不會處理更多記錄。我知道清理這些數據是不錯的,因爲壞行不會被插入,但是因爲我無法始終如一地控制測試環境中的數據子集,所以我無法保證由外部約束引用的表將具有一致的數據。通過gsa模板插入數據atg sql與錯誤恢復

如果我將整個內容包裝在一個事務中,那麼沒有記錄被插入,如果我用包含import-items的記錄包裝它,它會因爲表上的null約束而失敗(import-items嘗試插入部分記錄)。在它自己的事務中包裝每個元素並不會捕獲錯誤,它會將每一行插入到壞行中,但沒有任何事。

有沒有另一種方式來允許在將數據導入資源庫時發生錯誤恢復?或者在插入之前檢查gsa-template內的約束的方法?

文件以供參考

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<!DOCTYPE gsa-template SYSTEM "dynamosystemresource:/atg/dtds/gsa/gsa_1.0.dtd"> 
<gsa-template> 
<transaction> 
<add-item item-descriptor="vendorSku"> 
    <set-property name="skuItem"><![CDATA[0065-OC-OS]]></set-property> 
    <set-property name="vendorSkuId"><![CDATA[853-6520]]></set-property> 
    <set-property name="vendorItem"><![CDATA[781]]></set-property> 
</add-item> 
<add-item item-descriptor="vendorSku"> 
    <set-property name="skuItem"><![CDATA[0189-CRGONET-ONSI]]></set-property> 
    <set-property name="vendorSkuId"><![CDATA[8007146]]></set-property> 
    <set-property name="vendorItem"><![CDATA[76]]></set-property> 
</add-item> 
etc.. 
</gsa-template> 

回答

0

據我已經能夠迄今發現這是不可能做的正是這種沒有超載內部ATG方法。但是我確實發現,將數據插入到存儲庫中對於錯誤的數據,重複等等會變得更加靈活。如果您在更新期間明確設置了項目描述符,而不是允許存儲庫執行此操作。

所以在上面的例子中,如果vendorSku的ID字段是skuItem插入語句可以修改爲:如果該文件多次添加,將更新現有記錄而不是拋出錯誤

<add-item item-descriptor="vendorSku" id="0189-CRGONET-ONSI"> 
    <set-property name="vendorSkuId"><![CDATA[8007146]]></set-property> 
    <set-property name="vendorItem"><![CDATA[76]]></set-property> 
</add-item> 

這樣由於重複。您也可以使用<update-item>標記,並將添加標記設置爲true以實現相同的行爲。