Avatar billede rumbassen Nybegynder
17. september 2005 - 16:42 Der er 8 kommentarer og
1 løsning

Data fra xml til Sql database tager for lang tid

Jeg ønsker at få nedsat tiden på at få uploadet data fra en xml fil.
Det går rimeligt med små filer men når de bliver for store tager det meget lang tid.
For 64000 rows tager det ca et minut bare for at få lagt xml filen ind i dataset´et
Derefter for at lægge dataset´et videre op på sql serveren tager ingen tid.

Har i nogle gode forslag til hvordan det kan gøres hurtigere?


Her er hvad jeg har prøvet med:

SqlConnection connec = new SqlConnection(@"Data Source=(local);Integrated Security=SSPI;" + "Initial Catalog=AMI");
SqlDataAdapter SQLAdap = new SqlDataAdapter("select * from MEASUREMENT",connec);
SqlCommandBuilder SQLBuilder = new SqlCommandBuilder(SQLAdap);
DataSet DSFraSQL = new DataSet();
DSFraSQL.ReadXml(@"c:\MyXML.xml");
SQLAdap.Update(DSFraSQL);
Avatar billede arne_v Ekspert
17. september 2005 - 16:57 #1
parse XML og selv lav INSERT måske ?
Avatar billede rumbassen Nybegynder
17. september 2005 - 17:02 #2
Har du evt et eksempel på hvordan man kan parse xml?
Avatar billede arne_v Ekspert
17. september 2005 - 17:07 #3
XmlDocument er sikkert også langsomt

det hurtigste er uden tvivl XmlReader

vær opmærksom på at der nok skal skrives lidt kode
Avatar billede arne_v Ekspert
17. september 2005 - 17:10 #4
jeg lavede engang dette eksempel:

<?xml version="1.0" encoding="utf-8" ?>
<fields>
    <syncfield>
        <name>Test</name>
        <allowInsert>true</allowInsert>
        <allowDelete>true</allowDelete>
    </syncfield>
    <syncfield>
        <name>Test2</name>
        <allowInsert>false</allowInsert>
        <allowDelete>true</allowDelete>
    </syncfield>
</fields>

using System;
using System.IO;
using System.Xml;

class MainClass
{
    public static void Main(string[] args)
    {
        XmlTextReader xtr = new XmlTextReader(new StreamReader(@"C:\field.xml"));
        while(!xtr.EOF)
        {
            if(xtr.IsStartElement() && xtr.Name == "name")
            {
                Console.WriteLine("name = " + xtr.ReadString());
            }
            if(xtr.IsStartElement() && xtr.Name == "allowInsert")
            {
                Console.WriteLine("allowInsert = " + xtr.ReadString());
            }
            if(xtr.IsStartElement() && xtr.Name == "allowDelete")
            {
                Console.WriteLine("allowDelete = " + xtr.ReadString());
            }
            xtr.Read();
        }
    }
}
Avatar billede rumbassen Nybegynder
17. september 2005 - 17:20 #5
jeg står lige og skal noget nu her, men jeg kigger lige på dit eksempel i morgen. ind til videre tak
Avatar billede rumbassen Nybegynder
18. september 2005 - 14:02 #6
Det går lige så langsomt at få den til at løbe igennem xml filen på den måde.
Jeg ar fundet noget andet jeg godt kunne tænke mig at prøve, det var godt nok skrevet i vb.net og jeg ar lidt svært ved at gennemskue hvordan det skal laves helt korrekt i c#
Det er meningen at man sender xml filen med til sql serveren som parameter og så lader serveren kovcerterer i en stored procedure.

MSXML2.DOMDocument40 objXMLDOM  = new MSXML2.DOMDocument40();
ADODB.Connection connec = new ADODB.Connection();
ADODB.Command comm = new ADODB.Command();
objXMLDOM.async= false;
objXMLDOM.load(@"C:\MyXML.xml");

connec.Open(@"Data Source=(local);Integrated Security=SSPI;" + "Initial Catalog=AMI","","",-1);
comm.ActiveConnection = connec;
comm.CommandText = "SPInsertXML";
comm.CommandType = adCmdStoredProc;
comm.Parameters.Refresh();
comm.Parameters.Item(1).Value = objXMLDOM.xml;
comm.Execute();
connec.Close();

og her er den SP som skal ind i databasen:
CREATE PROCEDURE SPInsertXML

    @strXML ntext

AS
    DECLARE @iDoc int
    EXECUTE SPInsertXML @iDoc OUTPUT, @strXML
    INSERT INTO tblBooks (BookTitle, Publisher, DateOfPurchase)
      (SELECT * FROM OpenXML(@iDoc, '/Books/Book', 2)
                WITH
              (Title VARCHAR(100),
            Publisher VARCHAR(100),
            DateOfPurchase DateTime)
      )
EXECUTE sp_xml_removedocument @iDoc
GO
Avatar billede rumbassen Nybegynder
19. september 2005 - 09:03 #7
Her kom min løsning:

MSXML2.DOMDocument40 objXMLDOM  = new MSXML2.DOMDocument40();
objXMLDOM.async= false;
objXMLDOM.load(@"C:\MyXML.xml");
SqlConnection connec = new SqlConnection();
string connectionSTR = @"workstation id=PLAYING2WIND;packet size=4096;user id=AMIbruger;Password="Password";data source=AMI-SERVER;persist security info=False;initial catalog=Database";
connec.ConnectionString = connectionSTR;
connec.Open();
SqlCommand comm = new SqlCommand("spFromXML",connec);
comm.CommandType =  System.Data.CommandType.StoredProcedure;
comm.CommandTimeout = 180;
comm.Parameters.Add("@strXML",SqlDbType.NText);
comm.Parameters["@strXML"].Value = objXMLDOM.xml;
comm.ExecuteNonQuery();
comm = null;
connec.Close();
objXMLDOM = null;
connec = null;
System.GC.Collect();

Og en SP i Databasen:

CREATE PROCEDURE spFromXML
@strXML ntext
AS
DECLARE @iDoc int
EXECUTE sp_xml_preparedocument @iDoc OUTPUT, @strXML
INSERT INTO Measurement (MeasurementValue, MeasurementType, MeasurementDateTime)
(SELECT * FROM OpenXML(@iDoc, '/NewDataSet/Table', 2)
WITH (MeasurementValue char(4), MeasurementType char(1),MeasurementDateTime DateTime))
EXECUTE sp_xml_removedocument @iDoc
GO
Avatar billede rumbassen Nybegynder
19. september 2005 - 09:04 #8
Hvis du smidder et svar arne så får du lige nogle point for din indsats
Avatar billede arne_v Ekspert
19. september 2005 - 12:02 #9
.NET har indbygget XML support

System.Xml.XmlDocument bør kunne bruges fremfor MSXML2.DOMDocument40

og svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester