2009-03-31 11 views
1

Ich schreibe einen .net Windows-Dienst, mit dem ich ein XML analysieren muss (mit etwa 5000 Knoten). Ich muss diese Knoten analysieren und Daten (zB 5000 Zeilen) in eine SQL-Datenbank einfügen. Soll ich alle diese Datensätze mit Batch einfügen oder soll ich sie einzeln einfügen? kann mir jemand mit dem Design/Algorithmus für optimale Leistung helfen?Einfügen von Datensätzen aus einem XML in die Datenbank

Antwort

3

Von 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

Hallo, vielen Dank für Ihre inputs..my xml enthält etwa 5000 „Ordnung“ Knoten und ich versuche, sie in die Datenbank einfügen SqlBulkCopy mit .... während einige Datensätze einfügen konnte nicht in die Datenbank aufgenommen werden, dann kann ich diese fehlgeschlagenen Buch-IDs mit log4net.how in eine Protokolldatei aufnehmen. Wie erreiche ich diese Funktionalität? – user40907

0

Für eine optimale Performance verwenden ein forward only XML reader, ein transaction und ein bulk inserter

Natürlich ist diese Lösung etwas kniffliger und seine durchaus möglich, eine einfachere Implementierung besteht, dass weniger Code erfordert und führt ziemlich gut (EG. OPENXML)

1

Da Sie bereits mithilfe von SQL Server sind, würde ich empfehlen SSIS Check-out (Integration Servic es). Es hat eine eingebaute XML-Quelle, die direkt in SQL Server pumpt. Es ist schnell und würde Sie davon abhalten, diesen Code zu pflegen.

0

Sie könnten eine XSLT-Umwandlung verwenden, die den XML-Code mit insert-Anweisungen in eine SQL-Datei umwandelt.

Ich habe das einmal als Beweis für das Konzept in einem Tag oder so. Hier ist, was ich getan habe:

<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> 
Verwandte Themen