вставить записи в базу данных из XML - PullRequest
1 голос
/ 31 марта 2009

Пишу службу Windows .net, используя которую мне нужно проанализировать XML (около 5000 узлов) Мне нужно проанализировать эти узлы и вставить данные (т.е. 5000 строк) в базу данных SQL. Должен ли я вставить все эти записи с пакетной вставкой или я должен вставить их одну за другой? Может кто-нибудь помочь мне с дизайном / алгоритмом для оптимальной производительности?

Ответы [ 4 ]

3 голосов
/ 31 марта 2009

С Импорт данных XML в таблицу SQL Server с 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();
1 голос
/ 31 марта 2009

Поскольку вы уже используете SQL Server, я бы порекомендовал проверить SSIS (Integration Services). Он имеет встроенный источник XML, который будет качаться прямо в SQL Server. Это быстро и избавит вас от сохранения этого кода.

0 голосов
/ 04 апреля 2009

Вы можете использовать XSLT-преобразование, которое преобразует XML в файл SQL с операторами вставки.

Я сделал это однажды как подтверждение концепции за день или около того. Вот что я сделал:

<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>
0 голосов
/ 31 марта 2009

Для оптимальной производительности используйте средство чтения только XML , транзакция и массовый установщик

Конечно, это решение немного сложнее, и вполне возможно, что существует более простая реализация, которая требует меньше кода и работает довольно хорошо (например, OPENXML )

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...