2009-03-31 4 views
1

J'écris un service .net windows à l'aide duquel j'ai besoin d'analyser un xml (ayant environ 5000 nœuds). J'ai besoin d'analyser ces nœuds et d'insérer des données (par exemple 5 000 lignes) dans une base de données SQL. Dois-je insérer tous ces enregistrements avec l'insertion de lot ou dois-je les insérer un par un? quelqu'un peut-il m'aider avec le design/algorithme pour une performance optimale?insérer des enregistrements dans la base de données à partir d'un xml

Répondre

3

De Importing XML data into a SQL Server table with C# asp.net:

DataSet reportData = new DataSet(); 
reportData.ReadXml(Server.MapPath(”report.xml”)); 

SqlConnection connection = new SqlConnection(”CONNECTION STRING”); 
SqlBulkCopy sbc = new SqlBulkCopy(connection); 
sbc.DestinationTableName = “report_table”; 

//if your DB col names don’t match your XML element names 100% 
//then relate the source XML elements (1st param) with the destination DB cols 
sbc.ColumnMappings.Add(”campaign”, “campaign_id”); 
sbc.ColumnMappings.Add(”cost”, “cost_USD”); 

connection.Open(); 

//table 4 is the main table in this dataset 
sbc.WriteToServer(reportData.Tables[4]); 
connection.Close(); 
+0

Salut, merci pour votre xml inputs..my contient environ 5000 noeuds « de commande » et essaie de les insérer dans la base de données à l'aide SqlBulkCopy .... tout en insérant des enregistrements ne être ajouté dans la base de données, puis je wan pour enregistrer ces ID livre échoués dans un fichier journal en utilisant log4net.how puis-je réaliser cette fonctionnalité? – user40907

0

Pour une utilisation optimale de la performance d'un forward only XML reader, un transaction et un bulk inserter

Bien sûr, cette solution est un peu plus délicat et son une mise en œuvre plus simple tout à fait possible existe qui nécessite moins de code et exécute assez bien (EG. OPENXML)

1

Puisque vous utilisez déjà SQL Server, je recommande de vérifier SSIS (intégration Serv es). Il a une source XML intégrée qui ira directement dans SQL Server. C'est rapide et cela vous éviterait de maintenir ce code.

0

Vous pouvez utiliser une transformation XSLT qui transforme le code XML en un fichier SQL avec des instructions d'insertion.

Je l'ai fait une fois comme preuve de concept en un jour ou deux. Voici ce que je l'ai fait:

<xsl:strip-space elements="*"/> 

<xsl:template match="auditlog"> 
<xsl:if test="sequence/struct/wstring[@value='edr']/../union/string/@value"> 
INSERT INTO AUDITLOGS (FILENAME, EVENTTIME, EDR) VALUES(
    '<xsl:value-of select="@filename"/>', 
    '<xsl:value-of select="sequence/struct/union/any/sequence/struct/struct[@name='m_eventTime']/@datetime"/>', 
    '<xsl:value-of select="sequence/struct/wstring[@value='edr']/../union/string/@value"/>' 
); 
<xsl:apply-templates select="sequence"/> 
</xsl:if> 
</xsl:template> 

<xsl:template match="struct[@id='ModifiedBalance']"> 
INSERT INTO MODIFIEDBALANCE (SOURCEKIND, SOURCEID, TYPEID, NAMEID, ORIGINAL, CURRENT, LOGID) 
SELECT 
    '<xsl:value-of select="struct/enum/@value"/>', 
    <xsl:value-of select="struct/longlong/@value"/>, 
    <xsl:value-of select="struct/ushort[@id='BalanceTypeId']/@value"/>, 
    <xsl:value-of select="struct/ushort[@id='BalanceNameId']/@value"/>, 
    <xsl:value-of select="struct[@name='m_original']/@amount"/>, 
    <xsl:value-of select="struct[@name='m_current']/@amount"/>, 
    LOGID 
FROM AUDITLOGS 
    WHERE FILENAME = '<xsl:value-of select="../../../../../@filename"/>'; 
</xsl:template> 

</xsl:stylesheet>